我需要在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'
答案 0 :(得分:1)
您应该将数据结构更改为具有联结表。这是一个每product
和id
一行的表格。在字符串中存储列表确实非常糟糕。将整数存储在字符串中会增加侮辱伤害。
但是,有时你会被其他人的错误决定所困扰。如果是这样,您可以使用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 ...