在SQL单元格中删除重复的数字

时间:2019-11-07 07:48:33

标签: sql teradata

我是SQL的初学者。使用Teradata。

我需要删除SQL单元格中的重复数字。

例如:

In: 1, 2, 3, 4, 5, 2, 3, 6

Out: 1, 2, 3, 4, 5, 6

我在一列中有超过一百万个类似的单元格

4 个答案:

答案 0 :(得分:0)

已更新
我不熟悉Teradata sql,但我认为此解决方案可能有效:

SELECT DISTINCT CellValue 
FROM TABLE (STRTOK_SPLIT_TO_TABLE('tmp_test', 'Your SQL Cell String', ',')
 RETURNS 
(
  Outkey VARCHAR(10) CHARACTER SET UNICODE
 ,CellValue VARCHAR(10) CHARACTER SET UNICODE)
 ) AS dt

在此之后,您可以使用游标连接行。您可以查看here了解更多信息。

答案 1 :(得分:0)

这是多种方法的混搭,并假定您已启用XML Services。我没有可以测试的TD系统,因此它可能或很多不起作用,但希望它将为您提供一个起点:

WITH cte ( 
  SELECT ROW_NUMBER() OVER() AS id, MyCol AS str -- Give an "id" to each row
  FROM MyTable
)
SELECT 
  TRIM(
    TRAILING ',' FROM (
      XMLAGG(src.token || ',' ORDER BY src.token) (VARCHAR(10000))
    )
  )
FROM (
  SELECT d.outkey, d.token
  FROM TABLE (
    STRTOK_SPLIT_TO_TABLE(cte.id, cte.str, ', ')
    RETURNS (outkey integer, tokennum integer, token varchar(10))
  ) as d
  GROUP BY outkey, token -- Remove duplicate entries
) src
GROUP BY src.outkey -- Build new values
;

这个想法是拆分以逗号分隔的值,删除重复项,然后使用新的去重复的值重新构建分隔的字符串。这里是一些参考:

Split delimited list
Build delimited list

答案 2 :(得分:0)

通常在一个单元格(3NF和朋友...)中具有多个值并不是很好的样式-但是您可以随后使用STRTOK或CSV应用此功能-Functions 要获得此结果,您可以应用一个简单的区别。

答案 3 :(得分:-1)

例如,您可以尝试一下。

注意:您可以使用delimiter

拆分数据
  

SQL查询

    DECLARE @String VARCHAR(MAX) = '1, 2, 3, 4, 5, 2, 3, 6';
    DECLARE @Delimiter CHAR(1) = ','
    DECLARE @temptable TABLE(Items VARCHAR(255))
    DECLARE @idx INT
    DECLARE @slice VARCHAR(MAX)

    SELECT @idx = 1
        IF LEN(@String)<1 OR @String IS NULL  RETURN

    WHILE @idx!= 0
    BEGIN
        SET @idx = CHARINDEX(@Delimiter,@String)
        IF @idx!=0
            SET @slice = LEFT(@String,@idx - 1)
        ELSE
            SET @slice = @String

        IF(LEN(@slice)>0)
            INSERT INTO @temptable(Items) VALUES(TRIM(@slice))

        SET @String = RIGHT(@String,LEN(@String) - @idx)
        IF LEN(@String) = 0 BREAK       
    END 

    SELECT (STUFF((SELECT DISTINCT ', ' +  Items From @temptable FOR XML PATH('')),1,2,''))
  

OutPut

Output