SQL:逗号分隔值的GROUP BY子句

时间:2016-08-19 09:08:52

标签: mysql

任何人都可以帮我解决如何从多个逗号分隔值中检查重复值的问题。我有一个客户表,其中一个可以插入多个逗号分隔的联系号码,我想检查最后五位数的重复值。参考检查截图附加和所需的输出是 联系方式。计数 97359506775 - 2 390558073039-- 1 904462511251-- 1

enter image description here

2 个答案:

答案 0 :(得分:1)

如果可能,我建议您重新设计数据库架构。您当前的数据库违反了First Normal Form,因为您的属性值不是不可分割的。

创建一个表格,其中id和单个电话号码构成一个键,此约束强制执行不会发生重复。

答案 1 :(得分:0)

我不记得太多,但我会尝试提出这个想法(这是我很久以前用过的东西):

  1. 创建一个表值函数,该函数将id和电话号码作为输入,然后生成一个包含id和电话号码的表格并将其返回。
  2. 在查询传递ID和电话号码时使用此功能。查询是这样的,对于每个id,您获得与电话号码一样多的行。需要使用CROSS APPLY / OUTER APPLY。
  3. 然后你可以检查重复项。
  4. 该功能将是这样的:

    CREATE FUNCTION udf_PhoneNumbers
    (
        @Id INT
        ,@Phone VARCHAR(300)
    ) RETURNS @PhonesTable TABLE(Id INT, Phone VARCHAR(50))
    BEGIN
        DECLARE @CommaIndex INT
        DECLARE @CurrentPosition INT
        DECLARE @StringLength INT
        DECLARE @PhoneNumber VARCHAR(50)
    
        SELECT @StringLength = LEN(@Phone)
        SELECT @CommaIndex = -1
        SELECT @CurrentPosition = 1
        --index is 1 based
        WHILE @CommaIndex < @StringLength AND @CommaIndex <> 0
        BEGIN
            SELECT @CommaIndex = CHARINDEX(',', @Phone, @CurrentPosition)
    
            IF @CommaIndex <> 0
                SELECT @PhoneNumber = SUBSTRING(@Phone, @CurrentPosition, @CommaIndex - @CurrentPosition)
            ELSE
                SELECT @PhoneNumber = SUBSTRING(@Phone, @CurrentPosition, @StringLength - @CurrentPosition + 1)
    
            SELECT @CurrentPosition = @CommaIndex + 1
    
            INSERT INTO @UsersTable VALUES(@Id, @PhoneNumber)
        END
    
        RETURN
    END
    

    然后运行CROSS APPLY查询:

    SELECT 
        U.* 
        ,UD.*
    FROM yourtable U CROSS APPLY udf_PhoneNumbers(Userid, Phone) UD
    

    这将为您提供可以运行查询以查找副本的表。