我有一个用逗号分隔的列“A”,我想找到A列中的所有唯一值。
这是一个非常简短的例子:
Column A
111, 222
333
444
777,999
我想要一个查询,它给出了以下值:
Column C
111
222
333
444
777
999
答案 0 :(得分:2)
忽略所有评论中提到的表格设计的明显问题,并接受这可能在一张巨大的桌子上表现得很慢,这就是我可能会这样做的。
首先......我会创建一个语句,将所有行转换为一个大的逗号分隔列表。
DECLARE @tmp VarChar(max)
SET @tmp = ''
SELECT @tmp = @tmp + ColumnA + ',' FROM TableA
然后使用本SO文章描述的表值udf split将该大量字符串转换回带有distinct子句的表,以确保它是唯一的。
https://stackoverflow.com/a/2837662/261997
SELECT DISTINCT * FROM dbo.Split(',', @tmp)
答案 1 :(得分:0)
您可以将well-known Split function与outer apply
结合使用,将行拆分为多行:
select ltrim(rtrim(s.s)) as colC
from @t t
cross apply
dbo.split(',', t.colA) s
完整代码示例:
if object_id('dbo.Split') is not null
drop function dbo.Split
go
CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)
UNION ALL
SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
FROM Pieces
WHERE stop > 0
)
SELECT pn,
SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
FROM Pieces
)
go
declare @t table (colA varchar(max))
insert @t select '111, 223'
union all select '333'
union all select '444'
union all select '777,999';
select ltrim(rtrim(s.s)) as colC
from @t t
cross apply
dbo.split(',', t.colA) s