2016-08-19 63 views
0

任何人都可以幫助我如何從多個逗號分隔值中檢查重複值。我有一個客戶表,並且可以插入多個以逗號分隔的聯繫號碼,我想檢查最後五位數字的重複值。有關參考檢查附加的屏幕截圖以及所需的輸出是 contact_no。算上 97359506775 - 2 390558073039-- 1 904462511251-- 1SQL:逗號分隔值的GROUP BY子句

enter image description here

+0

請附上屏幕截圖 – dhS

+0

要麼規範化您的模式,要麼不打擾使用RDBMS – Strawberry

回答

1

我會建議您重新設計數據庫架構,如果可能的話。您的當前數據庫違反First Normal Form,因爲您的屬性值不可分割。

創建一個表,其中id與單個電話號碼一起構成密鑰,此約束強制不發生重複。

0

我不記得了,但我會盡量把這個想法(這件事情,我已經是很久以前使用):

  1. 創建一個表值函數,將採取ID和電話號碼作爲輸入,然後生成一個ID和電話號碼錶並返回。
  2. 在傳遞ID和電話號碼的查詢中使用此函數。該查詢是這樣的,每個id你可以得到與電話號碼一樣多的行。需要使用CROSS APPLY/OUTER APPLY。
  3. 然後你可以檢查重複。

職能是這樣的:

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 

這會給你上,您可以運行查詢查找重複表。