在SELECT中为IN语句声明var

时间:2015-06-24 12:46:13

标签: sql sql-server

我有那个sql代码

SELECT * FROM table1
WHERE id IN (1,2,3,4,5,6)

我想要那个表达

DECLARE @allNeededIds ??? = (1,2,3,4,5,6)

SELECT * FROM table1
WHERE id IN @allNeededIds

我可以在SQL中声明这样的东西,还是应该使用表格,那么代码会如何?我使用MS Sql Server

4 个答案:

答案 0 :(得分:9)

使用表变量:

DECLARE @allNeededIds table(id int not null)
insert into @allNeededIds (id) values (1),(2),(3),(4),(5),(6)

SELECT * FROM table1
WHERE id IN (select id from @allNeededIds)

如果您想将这组值从外部源传递到此代码中(例如,在存储过程中调用此代码或从其他语言运行它),您应该查看Table-Valued parameters

答案 1 :(得分:3)

您可以使用动态SQL执行此操作。

D:\TFS\local_profile.ps1

答案 2 :(得分:2)

你可以做的是这样的事情:

SELECT *
FROM table1
WHERE id IN (SELECT id FROM table2)

在哪种情况下SELECT id FROM table2会返回值1到6。

当然,如果内部SELECT将返回的值多于您需要的值,则需要使用额外的WHERE子句来调整查询,以仅过滤所需的值。 / p>

答案 3 :(得分:1)

首先创建一个Split函数,它将逗号分隔的字符串作为输入并返回一个表:

CREATE FUNCTION [dbo].Split(@input AS Varchar(4000) )
RETURNS
      @Result TABLE(Value BIGINT)
AS
BEGIN
      DECLARE @str VARCHAR(20)
      DECLARE @ind Int
      IF(@input is not null)
      BEGIN
            SET @ind = CharIndex(',',@input)
            WHILE @ind > 0
            BEGIN
                  SET @str = SUBSTRING(@input,1,@ind-1)
                  SET @input = SUBSTRING(@input,@ind+1,LEN(@input)-@ind)
                  INSERT INTO @Result values (@str)
                  SET @ind = CharIndex(',',@input)
            END
            SET @str = @input
            INSERT INTO @Result values (@str)
      END
      RETURN
END

其次,这样做是为了得到结果:

DECLARE @allNeededIds as varchar(max)
set @allNeededIds = '1,2,3,4,5,6'
select value into temp from Split(@allNeededIds)

最终查询将是:

SELECT * FROM table1
WHERE id IN (select value in temp)