这是我的问题:
我在 sql 列中有一个包含以下数据的列:
Answers
=======
1:2:5: <--- notice my delimiter
我需要能够将数字分解成一个结果集,我可以加入一个查找表,例如
Answers_Expanded
=======
1 apple
2 pear
3 cherry
4 mango
5 grape
并返回
Answers
=======
apple pear grape
有这样的方法吗?
谢谢!
这是我的问题:
我在 sql 列中有一个包含以下数据的列:
Answers
=======
1:2:5: <--- notice my delimiter
我需要能够将数字分解成一个结果集,我可以加入一个查找表,例如
Answers_Expanded
=======
1 apple
2 pear
3 cherry
4 mango
5 grape
并返回
Answers
=======
apple pear grape
有这样的方法吗?
谢谢!
这篇博文有一个很好的用户定义函数示例,该函数将返回一个表,其中包含列中分隔字符串的值。然后,您可以将该表加入您的 Answers_Expanded 表以获得您的值。
如果您正在解析相当短的字符串,并且如果您将其作为一次性的事情进行,那么这很好用,但是如果您有一个表格,其中您的答案存储在这样的列中,您不希望在整个表,因为它将对性能造成很大影响。理想情况下,您希望避免在 SQL 中获得这样的分隔字符串。
这有点像 hack(the LIKE
、theXML PATH
和 the STUFF
),它假定您希望答案按它们排序,ID
而不是与多值列中的原始顺序匹配...
但这会给出您正在寻找的结果:
SELECT STUFF((
SELECT ' ' + ae.Answer
FROM
Answers_Expanded ae
JOIN Answers a ON ':' + a.Answers LIKE '%:' + CAST(ae.ID AS VARCHAR) + ':%'
ORDER BY ae.ID
FOR XML PATH(''))
, 1, 1, '') AS Answers
这有效,因为:
LIKE
查找Answer_Expanded
与多值列匹配的任何行。XML PATH
simulates a group concatenation... and allows for ' '
to be specified as the delimiterSTUFF
removes the leading delimiter.我建议您以一个单元格只有一个数字的方式保存您的答案……而不是一个单元格中的多重信息。(违反第一范式)。
否则你最好使用一些高级的 sql 语言,例如 T-SQL。