在逗号分隔的文本列中查找唯一值

3

我有一个由逗号分隔的"A"列,我想在该列中找到所有唯一的值。

这里是一个非常简短的示例:

Column A
111, 222
333
444
777,999

我需要一个查询语句,用来获取以下数值:
Column C
111
222
333
444
777
999

4
你应该修复这个设计 - 它不是关系型的,而这就是你遇到问题的原因。 - Oded
这个问题不够清晰。你的意思是“我想要一个查询,它可以通过逗号分隔列A中的值,修剪结果字符串,并输出每个值的一行”吗? - Chris Shain
1
在我看來,需要重做數據模型。在字段中存儲逗號分隔的列表是一種糟糕的模型。這樣做違背了關聯數據庫的初衷。 - John Hartsock
可能是与https://dev59.com/XnRC5IYBdhLWcg3wYP-h重复的问题。 - Chris Shain
1
可能是[Irritative sql statement help needed]的重复问题(http://stackoverflow.com/questions/8564307/irritative-sql-statement-help-needed)。 - Mikael Eriksson
2个回答

2
忽略所有评论中暗示的你表格设计上明显存在的问题,并接受这种方法在大型表格上可能会非常慢的事实,以下是我可能会采取的做法。
首先... 我会创建一个语句,将所有行转换为一个巨大的逗号分隔列表。
DECLARE @tmp VarChar(max)
SET @tmp = ''
SELECT @tmp = @tmp + ColumnA + ',' FROM TableA

然后使用SO文章中描述的表值UDF split,将该大字符串转换回一个表格,并使用distinct子句确保它是唯一的。

https://dev59.com/XnRC5IYBdhLWcg3wYP-h#2837662

SELECT DISTINCT * FROM dbo.Split(',', @tmp)

0

您可以使用知名的Split函数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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接