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,每个 product
和 id
一行。将列表存储在字符串中真的非常糟糕。在字符串中存储整数会雪上加霜。
但是,有时您会被别人的错误决定所困。如果是这样,您可以使用 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 ...
我需要在 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,每个 product
和 id
一行。将列表存储在字符串中真的非常糟糕。在字符串中存储整数会雪上加霜。
但是,有时您会被别人的错误决定所困。如果是这样,您可以使用 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 ...