• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    SQL Server查询条件IN中能否使用变量的示例详解

    在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

    如下所示,如果查询条件里面,变量只有一个值,此时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 + ''''));

    下面这个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; 也就是说,上面SQL并不会按你所“设想”的逻辑运算。而是做了一个转换,为什么说是这样的一个转换呢? 当然这也是一个猜想,上面构造的例子也是为了侧面验证这个猜想,另外,上面两个SQL实际执行计划的参数列表(Parameter List)也侧面印证了这个猜想。如果执行计划解析成我们想要的结果,那么Parameter List应该是'b' 和‘c'

    解决方案:

    1:使用动态SQL

    使用动态SQL解决问题,似乎没啥好说的,如下例子所示:

    DECLARE @sql_cmd NVARCHAR(max);
    DECLARE @name VARCHAR(16);
     
    SET @name='b|c';
    SET @sql_cmd='SELECT * FROM TEST WHERE name IN (''' + REPLACE(@name,'|',''',''') +''');'
     
    EXEC sp_executesql @sql_cmd;

    2:使用临时表或表变量

    以这个例子来说,就是将字符串拆分,放入临时表或表变量,然后关联表也好,在IN里面使用子查询也OK。

    3:借助STRING_SPLIT()

    DECLARE @name VARCHAR(16);
     
    SET @name='b|c';
    SELECT *FROM test WHERE name IN (SELECT value FROM STRING_SPLIT(@name, '|'))

    注意:STRING_SPLIT函数只有较高版本才支持,SQL Server 2017或SQL Server 2016部分版本支持。

    4:借助XML函数来解决问题

    DECLARE @name VARCHAR(16);
    DECLARE @xml_para XML;
     
    SET @name = 'b|c';
    SET @xml_para = CAST(( 'A>' + REPLACE(@name, '|', '/A>A>') + '/A>' ) AS XML);
     
     
    SELECT *
    FROM dbo.TEST
    WHERE NAME IN ( SELECT A.value('.', 'varchar(max)') AS [Column]
         FROM  @xml_para.nodes('A') AS FN ( A ) );

    到此这篇关于SQL Server查询条件IN中能否使用变量的文章就介绍到这了,更多相关sqlserver条件查询in内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • sqlserver和oracle中对datetime进行条件查询的一点区别小结
    • MySql带OR关键字的多条件查询语句
    • Mysql带And关键字的多条件查询语句
    • SQL 多条件查询几种实现方法详细介绍
    • linq to sql 中,如何解决多条件查询问题,答案,用表达式树! (下)
    • linq to sql中,如何解决多条件查询问题,答案,用表达式树!
    • MySQL中使用case when 语句实现多条件查询的方法
    上一篇:SQL Server 添加Delete操作回滚日志方式
    下一篇:Sql Server 视图数据的增删改查教程
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    SQL Server查询条件IN中能否使用变量的示例详解 SQL,Server,查询,条件,中,能否,