2015-06-12 68 views
0

我需要在SQL Server 2005上進行查詢以匹配這種情況,我有一個varchar(max)字段,其​​中某個id是「12323,12345,123,434345,2324,1211212」,用戶會給我一個組,前3個數;那麼,在哪一個條款中,我必須用逗號分隔每個這個ID,任何建議?我怎樣才能做到這一點?在一個varchar字段與多個Id的

product | id 
prod01 1212,211,3434342,54532 
prod02 323,323,424,5435,35345 
prod03 2323,1212 

@UserEntry='123' 
+2

修復你的數據結構。你不應該用字符串存儲事物列表。使用聯結表 - 正確的數據庫方法。 –

+0

我的建議是修復你的數據庫。永遠不要使用這種結構。 –

+0

我不能這樣做,數據庫不是我的,數據是通過第三方購買的這種方式=/ –

回答

0

您需要一個函數將字符串拆分爲不同的值。這是一個。我不知道是誰最初寫它,但它一直在我們的圖書館,因爲永遠:

CREATE FUNCTION dbo.split_string (@v_string VARCHAR(2000), @v_delimiter VARCHAR(1)) 
    RETURNS @output TABLE (id INT IDENTITY NOT NULL, item VARCHAR(2000)) 
BEGIN 
    DECLARE @v_item VARCHAR(2000); 
    WHILE CHARINDEX(@v_delimiter, @v_string, 0) <> 0 
    BEGIN 
     SET @v_item = RTRIM(LTRIM(SUBSTRING(@v_string, 1, CHARINDEX(@v_delimiter, @v_string, 0) - 1))); 
     SET @v_string = RTRIM(LTRIM(SUBSTRING(@v_string, CHARINDEX(@v_delimiter, @v_string, 0) + LEN(@v_delimiter), LEN(@v_string)))); 
     IF LEN(@v_item) > 0 
     BEGIN 
      INSERT INTO @output SELECT @v_item; 
     END; 
    END; 

    IF LEN(@v_string) > 0   -- catch the last item 
    BEGIN 
     INSERT INTO @output SELECT @v_string; 
    END; 

    RETURN 
END 

這將返回不同的值作爲一個表變量,從中你可以使用IF @UserEntry IN ...

1

您應該更改數據結構以具有聯結表。這是一張表格,每行productid。將字符串存儲在字符串中確實非常糟糕。將整數存儲在字符串中會加重傷害。

但是,有時候你會被別人的糟糕決定所困住。如果是這樣,你可以使用like

where ',' + id + ',' like '%,' @UserEntry + ',%' 

然而,這是最後的手段,這樣的查詢不能使用索引的。到目前爲止,修復數據結構是最好的選擇。

+0

有時候你被別人的壞決定困住了,這正是這種情況:( –