在select查询中加入Table值函数

时间:2014-04-29 17:46:30

标签: sql-server

我有ques表:

Ques table

我有用户定义的split功能:

Select * from split('1,2,3,4')

通过拆分字符串

以表格格式返回数据

Data returned by Split()

我想在ques表上使用split函数编写select查询以获取如下数据:

id | ques | tags
-----------------
1 | abc | 1
2 | def | 1
2 | def | 2
3 | ghi | 2
4 | jkl | 3
4 | jkl | 4

任何人都可以帮助我加入吗?

2 个答案:

答案 0 :(得分:4)

您需要numbers table来有效地解析以逗号分隔的字符串。您可以在交叉应用于表的子查询中执行此操作:

select *
from ques
cross apply (
    select substring(tags, n, charindex(',', tags + ',', n) - n)
    from numbers 
    where substring(',' + tags, n, 1) = ','
    and n < len(tags) + 1
) x (c)

答案 1 :(得分:0)

迪恩先生的方法非常有创意,但我认为你可以通过使用与CROSS APPLY一起使用的相同分割功能来保持简单,见下文:

测试数据

DECLARE @TABLE TABLE (ID INT, ques VARCHAR(10), Tags VARCHAR(20))
INSERT INTO @TABLE VALUES
(1 , 'ABC', '1'),(2 , 'Def', '1,2'),(3 , 'ghi', '2'),
(4 , 'jkl', '3,4'),(5 , 'mno', '4,5')

<强>查询

SELECT t.ID, t.ques, C.items AS Tags
FROM @TABLE t
      CROSS APPLY (SELECT * FROM dbo.Split(t.Tags, ',')) C

结果集

╔════╦══════╦═══════╗
║ ID ║ ques ║ Tags  ║
╠════╬══════╬═══════╣
║  1 ║ ABC  ║     1 ║
║  2 ║ Def  ║     1 ║
║  2 ║ Def  ║     2 ║
║  3 ║ ghi  ║     2 ║
║  4 ║ jkl  ║     3 ║
║  4 ║ jkl  ║     4 ║
║  5 ║ mno  ║     4 ║
║  5 ║ mno  ║     5 ║
╚════╩══════╩═══════╝