0

抱歉,我不确定如何为这个问题命名。我想在 sql 中选择一些记录,其中特定列是一组字符串。

例子 。我有一个表学生,并有列 ID 和名称。ID 有记录 1,2,3,4,5,6 。名称有 A、B、C、D、E、F。

我想返回 ID=[3,4,5] 的 C,D,E。

我试过了

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

4

8 回答 8

5

尝试这个:

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

句法:

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

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

于 2013-10-21T08:05:27.237 回答
3

WHERE ID=2,3,4 并且 WHERE ID='2,3,4'是 SQL 的无效语法。

看起来你可以IN (Transact-SQL)根据你的情况使用。

确定指定值是否与子查询或列表中的任何值匹配。

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

你也可以看看 Jeff 的问题Parameterize an SQL IN clause

于 2013-10-21T08:05:27.710 回答
3

如果您@ID使用逗号分隔的 id 列表作为变量传递,WHERE IN (@ID)则将不起作用。

我认为最好的办法是先使用 aTable Valued function拆分它们,然后查询表。请在此处查看Split() 函数

用法:

SELECT * FROM STUDENT 
WHERE ID IN (
              SELECT items FROM dbo.Split(@ID, ',') --Split function here
            )
于 2013-10-21T08:09:56.663 回答
2

如果要在 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 

在这种情况下,采取第一个。最后一个非常慢,在这种情况下不推荐。

于 2013-10-21T08:08:24.697 回答
2

根据您在下面的评论,您不想转换ID为 int。相反,用于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;
于 2013-10-21T08:11:09.027 回答
2

请检查一下

Select * from Student where Id IN ('2','3','4')

并检查一下

Select Username from Student where ID IN ' + '('+ @Id +')'
 where @Id=2,3,4
于 2013-10-21T08:13:19.683 回答
2

由于您使用的是存储过程,它也只有相等比较,即 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))

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

于 2013-10-21T08:27:41.200 回答
2
Select * from Student where Id='2'
union all
Select * from Student where Id='3'
union all
Select * from Student where Id='4'
于 2013-10-21T08:41:13.533 回答