3

这是我的问题:

我在 sql 列中有一个包含以下数据的列:

Answers
=======
1:2:5: <--- notice my delimiter

我需要能够将数字分解成一个结果集,我可以加入一个查找表,例如

Answers_Expanded
=======
1 apple
2 pear
3 cherry
4 mango
5 grape

并返回

Answers
=======
apple pear grape

有这样的方法吗?

谢谢!

4

3 回答 3

1

这篇文有一个很好的用户定义函数示例,该函数将返回一个表,其中包含列中分隔字符串的值。然后,您可以将该表加入您的 Answers_Expanded 表以获得您的值。

如果您正在解析相当短的字符串,并且如果您将其作为一次性的事情进行,那么这很好用,但是如果您有一个表格,其中您的答案存储在这样的列中,您不希望在整个表,因为它将对性能造成很大影响。理想情况下,您希望避免在 SQL 中获得这样的分隔字符串。

于 2013-02-26T20:25:06.893 回答
1

这有点像 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

Sql 小提琴

这有效,因为:

  1. 连接LIKE查找Answer_Expanded与多值列匹配的任何行。
  2. XML PATH simulates a group concatenation... and allows for ' ' to be specified as the delimiter
  3. STUFF removes the leading delimiter.
于 2013-02-26T20:52:57.707 回答
0

我建议您以一个单元格只有一个数字的方式保存您的答案……而不是一个单元格中的多重信息。(违反第一范式)。

否则你最好使用一些高级的 sql 语言,例如 T-SQL。

于 2013-02-26T20:16:21.627 回答