0

申し訳ありませんが、質問に適切なタイトルを付ける方法がわかりません。特定の列が文字列のセットである SQL でいくつかのレコードを選択したいと考えています。

例 。テーブルの学生があり、ID と名前の列があります。ID にはレコード 1,2,3,4,5,6 があります。NAme には A、B、C、D、E、F があります。

C、D、E WHERE ID=[3,4,5] を返したい。

私は試した

SELECT FROM student WHERE ID=2,3,4

エラー、IDを返し、ID=2,3,4 ='2,3,4'を単一の列として読み取ります。私は混乱しています。

また、私の場合、ID セットは storedprocedure 変数で返されます。それは@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)ません。

Table Valued function最初に a を使用してそれらを分割し、次にテーブルをクエリするのが最善だと思います。Split() 関数については、こちらを確認してください。

使用法:

SELECT * FROM STUDENT 
WHERE ID IN (
              SELECT items FROM dbo.Split(@ID, ',') --Split function here
            )
于 2013-10-21T08:09:56.663 に答える
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

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 

この場合、最初のものを取ります。最後の 1 つは非常に遅く、このシナリオではお勧めできません。

于 2013-10-21T08:08:24.697 に答える
2

Stored Procedure を使用しているため、これにも等値比較、つまり id = 1 しかないため、入力をコンマ区切りの値で分割して 3 つのクエリを実行する必要があります。

または、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 に答える
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 に答える