[SQL] 分解字符串并查询相关数据 →→→→→进入此内容的聊天室

来自 , 2020-11-01, 写在 SQL, 查看 105 次.
URL http://www.code666.cn/view/456048af
  1. 说明:通过使用函数等方法分解字符串查询相关数据。
  2.  
  3. 问题:通过分解一个带某种符号分隔的字符串在数据库中查找相关数据。
  4. 例如 @str = '1,2,3',查询下表得到记录1,4,5,6
  5. ID TypeID
  6. 1 1,2,3,4,5,6,7,8,9,10,11,12
  7. 2 2,3
  8. 3 3,7,8,9
  9. 4 2,6
  10. 5 4,5
  11. 6 6,7
  12. */
  13. -----------------------------
  14. CREATE TABLE tb (ID INT , TypeID VARCHAR(30))
  15. INSERT INTO tb VALUES(1 , '1,2,3,4,5,6,7,8,9,10,11,12')
  16. INSERT INTO tb VALUES(2 , '2,3')
  17. INSERT INTO tb VALUES(3 , '3,7,8,9')
  18. INSERT INTO tb VALUES(4 , '2,6')
  19. INSERT INTO tb VALUES(5 , '4,5')
  20. INSERT INTO tb VALUES(6 , '6,7')
  21. GO
  22. -----------------------------
  23. --如果仅仅是一个,如@str = '1'.
  24. DECLARE @str AS VARCHAR(30)
  25. SET @str = '1'
  26. SELECT * FROM tb WHERE charindex(',' + @str + ',' , ',' + TypeID + ',') > 0
  27. SELECT * FROM tb WHERE ',' + TypeID + ',' LIKE '%,' + @str + ',%'
  28. /*
  29. ID TypeID
  30. ----------- ------------------------------
  31. 1 1,2,3,4,5,6,7,8,9,10,11,12
  32. (所影响的行数为 1 行)
  33. */
  34.  
  35. -----------------------------
  36. --如果包含两个,如@str = '1,2'.
  37. DECLARE @str AS VARCHAR(30)
  38. SET @str = '1,2'
  39. SELECT * FROM tb WHERE charindex(',' + LEFT(@str , charindex(',' , @str) - 1) + ',' , ',' + typeid + ',') > 0 OR
  40. charindex(',' + SUBSTRING(@str , charindex(',' , @str) + 1 , len(@str)) + ',' , ',' + typeid + ',') > 0
  41. SELECT * FROM tb WHERE ',' + typeid + ',' LIKE '%,' + LEFT(@str , charindex(',' , @str) - 1) + ',%' OR
  42. ',' + typeid + ',' LIKE '%,' + SUBSTRING(@str , charindex(',' , @str) + 1 , len(@str)) + ',%'
  43. /*
  44. ID TypeID
  45. ----------- ------------------------------
  46. 1 1,2,3,4,5,6,7,8,9,10,11,12
  47. 2 2,3
  48. 4 2,6
  49. (所影响的行数为 3 行)
  50. */
  51.  
  52. -------------------------------------------
  53. --如果包含三个或四个,用PARSENAME函数来处理.
  54. DECLARE @str AS VARCHAR(30)
  55. SET @str = '1,2,3,4'
  56. SELECT * FROM tb WHERE
  57. charindex(',' + parsename(REPLACE(@str , ',' , '.') , 4) + ',' , ',' + typeid + ',') > 0 OR
  58. charindex(',' + parsename(REPLACE(@str , ',' , '.') , 3) + ',' , ',' + typeid + ',') > 0 OR
  59. charindex(',' + parsename(REPLACE(@str , ',' , '.') , 2) + ',' , ',' + typeid + ',') > 0 OR
  60. charindex(',' + parsename(REPLACE(@str , ',' , '.') , 1) + ',' , ',' + typeid + ',') > 0
  61. SELECT * FROM tb WHERE
  62. ',' + typeid + ',' LIKE '%,' + parsename(REPLACE(@str , ',' , '.') , 4) + ',%' OR
  63. ',' + typeid + ',' LIKE '%,' + parsename(REPLACE(@str , ',' , '.') , 3) + ',%' OR
  64. ',' + typeid + ',' LIKE '%,' + parsename(REPLACE(@str , ',' , '.') , 2) + ',%' OR
  65. ',' + typeid + ',' LIKE '%,' + parsename(REPLACE(@str , ',' , '.') , 1) + ',%'
  66. /*
  67. ID TypeID
  68. ----------- ------------------------------
  69. 1 1,2,3,4,5,6,7,8,9,10,11,12
  70. 2 2,3
  71. 3 3,7,8,9
  72. 4 2,6
  73. 5 4,5
  74. (所影响的行数为 5 行)
  75. */
  76.  
  77. ---------------------------------------
  78. --如果超过四个,则只能使用函数或动态SQL来分解并查询数据。
  79. /*
  80. 名称:fn_split函数.
  81. 功能:实现字符串分隔功能的函数
  82. */
  83. CREATE FUNCTION dbo.fn_split(@inputstr VARCHAR(8000), @seprator VARCHAR(10))
  84. RETURNS @temp TABLE (a VARCHAR(200))
  85. AS
  86. BEGIN
  87. DECLARE @i INT
  88. SET @inputstr = rtrim(ltrim(@inputstr))
  89. SET @i = charindex(@seprator , @inputstr)
  90. while @i >= 1
  91. BEGIN
  92. INSERT @temp VALUES(LEFT(@inputstr , @i - 1))
  93. SET @inputstr = SUBSTRING(@inputstr , @i + 1 , len(@inputstr) - @i)
  94. SET @i = charindex(@seprator , @inputstr)
  95. END
  96. IF @inputstr <> '\'
  97. insert @temp values(@inputstr)
  98. return
  99. end
  100. go
  101.  
  102. --调用
  103. declare @str as varchar(30)
  104. set @str = '1,2,3,4,5'
  105.  
  106. select distinct m.* from tb m,
  107. (select * from dbo.fn_split(@str,',')) n
  108. where charindex(',' + n.a + ',' , ',' + m.typeid + ',') > 0
  109.  
  110. drop table tb
  111. drop function dbo.fn_split
  112.  
  113. /*
  114. ID TypeID
  115. ----------- ------------------------------
  116. 1 1,2,3,4,5,6,7,8,9,10,11,12
  117. 2 2,3
  118. 3 3,7,8,9
  119. 4 2,6
  120. 5 4,5
  121. (所影响的行数为 5 行)
  122. */
  123.  
  124. ------------------------------------------
  125. --使用动态SQL的语句。
  126. declare @str varchar(200)
  127. declare @sql as varchar(1000)
  128. set @str = '1,2,3,4,5'
  129. set @sql = 'SELECT ''' + replace(@str , ',' , ''' AS id UNION ALL SELECT ''')
  130. set @sql = @sql + ''''
  131. set @sql = 'SELECT DISTINCT a.* FROM tb a , (' + @sql + ') b WHERE charindex(' + ''','' + b.id + ' + ''',''' + ' , ' + ''','' + a.typeid + ' + ''',''' + ') > 0 '
  132. exec (@sql)
  133. /*
  134. ID TypeID
  135. ----------- ------------------------------
  136. 1 1,2,3,4,5,6,7,8,9,10,11,12
  137. 2 2,3
  138. 3 3,7,8,9
  139. 4 2,6
  140. 5 4,5
  141. (所影响的行数为 5 行)
  142. */
  143.  
  144. //sql/1211

回复 "分解字符串并查询相关数据"

这儿你可以回复上面这条便签

captcha