当前位置 博文首页 > 潇湘隐者:SQL Server解惑——查询条件IN中能否使用变

    潇湘隐者:SQL Server解惑——查询条件IN中能否使用变

    作者:潇湘隐者 时间:2021-06-21 17:41

    在SQL Server的查询条件中,能否在IN里面使用变量呢? 如果可以的话,有没有需要注意的地方或一些限制呢?在回答这个问题前,我们先来看看这个例子:

     

    IF EXISTS (SELECT 1 FROM sys.objects WHERE name='TEST' AND type='U')
    BEGIN
        DROP TABLE TEST;
    END
    GO
    CREATE TABLE TEST ( ID INT, NAME VARCHAR(16) );
    GO
     
    INSERT INTO dbo.TEST
    SELECT 1, 'a'  UNION ALL
    SELECT 2, 'b'  UNION ALL
    SELECT 3, 'c'  UNION ALL
    SELECT 4, 'a,b'UNION ALL
    SELECT 5, '''b'',''c''' UNION ALL
    SELECT 6, '''b';
    GO

     

    clip_image001

     

    如下所示,如果查询条件里面,变量只有一个值,此时SQL是正常的。 

    DECLARE @name VARCHAR(16);
    SET @name='a';
     
    SELECT * FROM TEST WHERE name IN (@name);
    GO
     
    DECLARE @name VARCHAR(16);
    SET @name='a,b';
     
    SELECT * FROM TEST WHERE name IN (@name);
    GO

     

    如果我们想在查询条件IN里面输入多个值呢?假如有这样的一个需求,一个变量里面包含b和c的值,现在用'b|c作为条件传入,对其进行拆分为变量'b'和'c', 想查出name=b 和name=c的记录,如下截图所示,SQL其实并没有按你所设想/预想的查出对应记录,而是将ID=5的记录查出来了

     

    DECLARE @name1 VARCHAR(16);
    DECLARE @name2 VARCHAR(16);
    SET @name1='b|c';
    SET @name2=REPLACE(@name1,'|',''',''')
    SELECT @name2
     
    SELECT * FROM TEST WHERE name IN (('''' + @name2 + ''''));

     

     

    clip_image002

     

    下面这个SQL也是同样的结果。 

     

    DECLARE @name1 VARCHAR(16);
    DECLARE @name2 VARCHAR(16);
    SET @name1='b|c';
    SET @name2='''' + REPLACE(@name1,'|',''',''') +''''
    SELECT @name2
     
    SELECT * FROM TEST WHERE name IN (@name2 );

     

    为什么出现了这样的结果呢? 查了大量的官方文档,没有看到关于这个问题的介绍和解释。如果一定要解释上面现象的情况的话,那么是因为SELECT * FROM TEST WHERE name IN (@name2 ); 其实转化为了SELECT * FROM TEST WHERE name =@name2;