经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
SQL 拼接字符串 使用IN查询方法
来源:cnblogs  作者:xiaochu698  时间:2019/5/28 9:07:58  对本文有异议

问题描述

当在 SQL SERVER 中查询的时候,同事遇到一个字段存储的字符串为用逗号分隔的主键 ID 值,格式为:1,2,3,4,这时候需要查询符合条件的所有数据,所以选择使用 IN 查询,但是直接执行会提示错误:在将 varchar 值 '1,2,3,4' 转换成数据类型 int 时失败。于是咨询我怎么解决呢?

我看了下错误信息,很明显是因为 IN 的字段是一个 Int 类型,强制把 varchar '1,2,3,4' 转换成 Int 语法是不允许的,所以查询失败。如下解决思路告诉我了同事。

 

解决思路

如果要使用 IN 就必须把当前字符串 “列的形式” 转换成 “行的形式” 语法上才行,也就是说把 '1,2,3,4' 的字符串转换成一个只有一列的表才行,表中有4行数据分别存储1,2,3,4,这时候就可以正确使用 IN 关键字来了。那如何解决就不报错还能查询数据呢?解决利器是 SQL SERVER 中表值函数(可以理解是一个有 TABLE 返回值的方法)

在 SQL 中位置在 数据库名称 --> 可编程性 --> 表值函数

告诉同事按照这个思路试着写下,我随后也写了一个通用的表值函数给他,废话不多说,直接上关键代码。

 

关键代码

  1. CREATE FUNCTION [dbo].[F_SUBSTRINGINTARRAY]
  2. (
  3. @STR VARCHAR(1000), --字符串队列格式为:1,2,3,4
  4. @CHAR VARCHAR(10) --截取字符串的符号:,
  5. )
  6. RETURNS @RESULT TABLE(ID INT)
  7. AS
  8. BEGIN
  9. DECLARE @INDEX INT --声明截取符号的位置
  10. DECLARE @ORDERID INT --声明获取的INT编号
  11. --判断传递的字符串不能为空
  12. IF LEN(@STR) > 0
  13. BEGIN
  14. --查询第一个符号,的位置
  15. SET @INDEX = CHARINDEX(@CHAR, @STR)
  16. --循环截取字符串
  17. WHILE @INDEX > 0
  18. BEGIN
  19. --截取第一个,位置的值
  20. SET @ORDERID = SUBSTRING(@STR, 1, @INDEX - 1)
  21. --截取@STR字符串第一个值,截取后变成 2,3,4
  22. SET @STR = SUBSTRING(@STR, @INDEX + 1, LEN(@STR) - @INDEX)
  23. --重新给@INDEX赋值
  24. SET @INDEX = CHARINDEX(@CHAR, @STR)
  25. --插入到返回的表格中
  26. INSERT INTO @RESULT(ID) VALUES(@ORDERID)
  27. END
  28. --判断是否截取到最后一个
  29. IF @INDEX = 0 AND LEN(@STR) > 0
  30. BEGIN
  31. --插入到返回的表格中
  32. INSERT INTO @RESULT(ID) VALUES(@STR)
  33. END
  34. END
  35. RETURN
  36. END
  37. /*
  38. 测试当前的函数
  39. --第一种情况
  40. SELECT * FROM [DBO].[F_SUBSTRINGINTARRAY]('1,2,3', ',')
  41. --第二种情况
  42. SELECT * FROM [DBO].[F_SUBSTRINGINTARRAY]('1', ',')
  43. */
  44. GO

完美解决问题!我很开心能帮到他,同时也得到了一个大大的??

由于编程能力有限,只考虑到目前几种情况,如有问题请指正,谢谢了~

 

总结

当遇到 SQL 语句问题时,先分析错误原因,然后思考如何解决的思路,根据思路编写 SQL 语句,最后通过不断测试来强化函数,变成通用函数,下次遇到这个问题可以直接调用。

 

如需转载请注明出处,谢谢了!

原文链接:http://www.cnblogs.com/Anypd/p/10934646.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号