将sql列拆分为可查询的结果集

时间:2013-02-26 19:57:21

标签: sql sql-server-2008

这是我的问题:

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

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

我需要能够将数字分解为一个结果集,我可以将其连接到查找表,例如

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

并返回

Answers
=======
apple pear grape

有这样的方式吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

这个blog post有一个很好的用户定义函数示例,它将返回一个表,其中包含列中分隔字符串的值。然后,您可以将该表连接到Answers_Expanded表以获取您的价值。

如果您正在解析相当短的字符串,并且如果您将其作为一次性事情进行,那么这可以正常工作,但是如果您将表的答案存储在类似的列中,则您不希望运行这对整个桌子来说都是一个很大的表现。理想情况下,您希望避免在SQL中获得这样的分隔字符串。

答案 1 :(得分:1)

这有点像黑客(LIKEXML PATHSTUFF),它假定您希望按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 Fiddle

这是因为:

  1. 加入LIKE会找到与多值列匹配的所有Answer_Expanded行。
  2. XML PATH模拟群组连接...并允许将' '指定为分隔符
  3. STUFF删除了前导分隔符。

答案 2 :(得分:0)

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

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