在具有多个Id的varchar字段的位置

时间:2015-06-12 02:51:30

标签: sql sql-server where varchar

我需要在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' 

2 个答案:

答案 0 :(得分:1)

您应该将数据结构更改为具有联结表。这是一个每productid一行的表格。在字符串中存储列表确实非常糟糕。将整数存储在字符串中会增加侮辱伤害。

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

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

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

答案 1 :(得分: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 ...