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

问题描述 投票:0回答:3

我有一个用逗号分隔的“A”列,我想找到 A 列中的所有唯一值。

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

Column A
111, 222
333
444
777,999

我想要一个能给我以下值的查询:

Column C
111
222
333
444
777
999
sql sql-server sql-server-2008 sql-server-2005
3个回答
2
投票

忽略所有评论中提到的表格设计的明显问题,并接受在巨大的表格上这可能会非常慢,这就是我可能会做的事情。

首先...我将创建一个语句,将所有行变成一个巨大的逗号分隔列表。

DECLARE @tmp VarChar(max)
SET @tmp = ''
SELECT @tmp = @tmp + ColumnA + ',' FROM TableA

然后使用这篇 SO 文章中描述的表值 udf split 将该大量字符串转换回带有 unique 子句的表,以确保其唯一。

https://stackoverflow.com/a/2837662/261997

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

0
投票

您可以使用众所周知的拆分函数

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

0
投票

使用 SQL Server 2016 中提供的 STRING_SPLIT,我将按如下方式解决它:

SELECT  DISTINCT CAST(s.value AS INT) value
FROM    Table1
CROSS   APPLY STRING_SPLIT(ColA, ',') s
ORDER   BY value

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.