WHERE 在具有多个 ID 的 varchar 字段上

WHERE over a varchar field with multiple Id's

我需要在 SQL Server 2005 上进行查询以匹配这种情况,我有一个 varchar(max) 字段,其中包含一些 id:“12323,12345,123,434345,2324,1211212”,用户会给我一组,前3个号码;所以,在 where 子句中,我必须匹配每个用逗号分隔的 id,有什么建议吗?我该怎么做?

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

@UserEntry='123' 

您应该更改数据结构以具有联结 table。这是一个 table,每个 productid 一行。将列表存储在字符串中真的非常糟糕。在字符串中存储整数会雪上加霜。

但是,有时您会被别人的错误决定所困。如果是这样,您可以使用 like:

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

但是,这是最后的手段,此类查询不能使用索引。到目前为止,修复数据结构是最好的选择。

您需要一个函数来将字符串拆分成单独的值。这是一个。我不知道最初是谁写的,但它一直在我们的图书馆中:

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

这会将 return 单独的值作为 table 变量,您可以从中使用 IF @UserEntry IN ...