如何在 SQL 的 WHERE 语句中使用一组字符串
本文关键字:字符串 一组 SQL 语句 WHERE | 更新日期: 2023-09-27 18:36:22
对不起,我不知道如何很好地命名这个问题。我想在 sql 中选择一些记录,其中特定列是一组字符串。
例。我有一个表学生,有列 ID 和名称。ID 有记录 1,2,3,4,5,6 。NAme有A,B,C,D,E,F。
我想返回 C,D,E,其中 ID=[3,4,5]。
我试过了
SELECT FROM student WHERE ID=2,3,4
它给出错误、ID =2,3,4 ='2,3,4'
并将 ID 读取为单个列。我很困惑。
同样在我的情况下,ID 集在存储过程变量中返回。 这就像@ID
SELECT * FROM STUDENT WHERE ID=@ID
上面的@ID是保存集合 {1,2,3} 的字符串类型的变量。请提供任何帮助,我们将不胜感激。
试试这个:
SELECT * FROM student WHERE ID IN (2,3,4)
语法:
test_expression IN
( subquery | expression [ ,...n ]
)
在此处阅读有关 IN 运算符的更多信息。
WHERE ID=2,3,4
和WHERE ID='2,3,4'
是SQL的无效语法。
看起来你可以根据自己的情况使用IN (Transact-SQL)
。
确定指定的值是否与子查询中的任何值匹配 或列表。
SELECT FROM student WHERE ID IN (2, 3, 4)
你也可以看看杰夫的问题参数化一个SQL IN子句
如果您将@ID
作为变量传递,并带有逗号分隔的 id 列表,则WHERE IN (@ID)
将不起作用。
我认为最好的办法是使用Table Valued function
先拆分它们,然后查询表。请在此处查看 Split() 函数。
用法:
SELECT * FROM STUDENT
WHERE ID IN (
SELECT items FROM dbo.Split(@ID, ',') --Split function here
)
如果要在 Select 中拟合多个值,则应使用"in ()":
SELECT * FROM student WHERE ID in (2,3,4)
OR
SELECT * FROM student WHERE ID between 2 and 4
OR
SELECT * FROM student WHERE ID = 2 OR ID = 3 OR ID = 4
在这种情况下,采取第一个。最后一个非常慢,在这种情况下不建议使用。
请检查一下
Select * from Student where Id IN ('2','3','4')
并检查一下
Select Username from Student where ID IN ' + '('+ @Id +')'
where @Id=2,3,4
Select * from Student where Id='2'
union all
Select * from Student where Id='3'
union all
Select * from Student where Id='4'
根据您在下面的评论,您不想将ID
转换为整数。相反,请使用LIKE
进行比较:
SELECT * from STUDENT
WHERE ', '+@ID+', ' LIKE ', '+CAST(ID as NVARCHAR(255)) + ', ';
但是,不会为查询编制索引。如果要为查询编制索引,请使用动态 SQL:
DECLARE @query NVARCHAR(max) = 'SELECT * FROM STUDENT WHERE ID IN ('+ @ID +')';
EXEC sp_executesql @query;
由于您使用的是存储过程,因此也只有相等比较,即id = 1,因此您也可以通过按逗号分隔值拆分输入来执行三个查询。
或者,您可以使用 SQL 将带有自定义函数的新过程添加到服务器
CREATE FUNCTION dbo.myparameter_to_list (@parameter VARCHAR(500)) returns @myOutput TABLE (mytempVal VARCHAR(40))
AS
begin
DECLARE @TempTable table
(
mytempVal VARCHAR(40)
)
DECLARE @MySplittedValue varchar(40), @PositionOfComma int
SET @par = LTRIM(RTRIM(@parameter))+ ','
SET @PositionOfComma = CHARINDEX(',', @parameter, 1)
IF REPLACE(@parameter, ',', '') <> ''
BEGIN
WHILE @PositionOfComma > 0
BEGIN
SET @MySplittedValue = LTRIM(RTRIM(LEFT(@par, @PositionOfComma - 1)))
IF @MySplittedValue <> ''
BEGIN
INSERT INTO @TempTable (mytempVal) VALUES (@MySplittedValue) --Use conversion if needed
END
SET @par = RIGHT(@par, LEN(@par) - @PositionOfComma)
SET @PositionOfComma = CHARINDEX(',', @par, 1)
END
END
INSERT @myOutput
SELECT mytempVal
FROM @TempTable
RETURN
END
在存储过程中,您将像这样使用它:
Create Procedure StudentSelectFromSet
@Ids VARCHAR(MAX)
AS
SELECT * FROM student Stud
WHERE Stud.Id IN(SELECT value FROM dbo.myparameter_to_list (@Ids))
然后像您之前访问的那样执行此新过程。