sqlserver判断条件输出字符(SQL Server查询条件IN中能否使用变量的示例详解)
sqlserver判断条件输出字符
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乐观锁与悲观锁(sql server中死锁排查的全过程分享)
- SQLserver中cube:多维数据集实例详解(SQLserver中cube:多维数据集实例详解)
- sqlserver追加主键(sqlserver主键自增的实现示例)
- sqlserver统计表大小(SqlServer 垂直分表减少程序改动)
- sqlserver表分区步骤(行转列之SQL SERVER PIVOT与用法详解)
- sqlserver连接字符串函数(SQL SERVER 2012新增函数之字符串函数FORMAT详解)
- 阿里云sql server 2012(远程连接阿里云SqlServer 2012 数据库服务器的图文教程)
- sqlserver索引策略(SQLServer性能优化--间接实现函数索引或者Hash索引)
- sqlserver存储删除过程(Sql中存储过程的定义、修改和删除操作)
- sqlserver分表后如何查询(SQL Server中row_number分页查询的用法详解)
- sqlserver索引实例(SQL Server索引的原理深入解析)
- SQLServer2019安装教程图文详解(SQLServer2019安装教程图文详解)
- 详解SqlServer数据库中Substring函数的用法(详解SqlServer数据库中Substring函数的用法)
- sqlserver降序排列(SQL SERVER临时表排序问题的解决方法)
- sqlserver安装日志文件夹(SQL SERVER日志进行收缩的图文教程)
- sqlserver修改排序规则几种方法(SQL Server 分页编号的另一种方式推荐)
- 览邦G08 Plus SMART WATCH 测评⑱ 全独立这才是智能手表该有的样子(览邦G08PlusSMART)
- 荣耀手表 GS 3 真机亮相 不支持无线充电(荣耀手表GS3)
- 通过体温就能为智能手表充电 原来是用NASA在空间站用的黑科技(通过体温就能为智能手表充电)
- 智能手表兼容Windows和Android 无需充电挑战苹果(智能手表兼容Windows和Android)
- 一天一冲也算表 麦步,一款待机 21 天的智能手表体验评测(一天一冲也算表)
- 魅族智能手表充电座曝光 Type-C 接口,线座分离设计(魅族智能手表充电座曝光)
热门推荐
- Mysql官方性能测试工具mysqlslap的使用简介(Mysql官方性能测试工具mysqlslap的使用简介)
- python统计字符类型和数量(python统计中文字符数量的两种方法)
- sqlserver代理无法启动错误1607(SQL Server代理:理解SQL代理错误日志处理方法)
- 手机网站设计的几个建议
- python函数基本使用(Python3中exp函数用法分析)
- springcloud alibaba nacos linux配置的详细教程(springcloud alibaba nacos linux配置的详细教程)
- linux 长模式查看文件(linux 查看文件系统类型实例方法)
- 部署docker需要什么配置(解决Docker必须使用sudo操作的问题)
- iframe如何解决跨域问题(关于iframe跨域使用postMessage的实现)
- js基础入门到高级教程(浅谈如何循序渐进的学好JS)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9