如何在 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} 的字符串类型的变量。请提供任何帮助,我们将不胜感激。

如何在 SQL 的 WHERE 语句中使用一组字符串

试试这个:

SELECT * FROM student WHERE ID IN (2,3,4)

语法:

test_expression IN 
    ( subquery | expression [ ,...n ]
    ) 

在此处阅读有关 IN 运算符的更多信息。

WHERE ID=2,3,4WHERE 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))

然后像您之前访问的那样执行此新过程。