web-dev-qa-db-ja.com

SQL Serverの結果セットを文字列に変換します

私は次のようにSQL Serverで結果を得ています

SELECT StudentId FROM Student WHERE condition = xyz

私は次のような出力を得ています

 StudentId 
 1236 
 
 7656 
 
 8990 
 ........ 

ストアドプロシージャの出力パラメーターは@studentId文字列とreturnステートメントが

1236, 7656, 8990.

出力を単一の文字列に変換するにはどうすればよいですか?

単一の列を返します[つまり、学生証]

40
Zerotoinfinity

これをテストします:

 DECLARE @result NVARCHAR(MAX)

 SELECT @result = STUFF(
                        (   SELECT ',' + CONVERT(NVARCHAR(20), StudentId) 
                            FROM Student 
                            WHERE condition = abc 
                            FOR xml path('')
                        )
                        , 1
                        , 1
                        , '')
45
ABI
DECLARE @result varchar(1000)

SELECT @result = ISNULL(@result, '') + StudentId + ',' FROM Student WHERE condition = xyz

select substring(@result, 0, len(@result) - 1) --trim extra "," at end
56
Bonshington

COALESCE関数を使用します。

DECLARE @StudentID VARCHAR(1000)
SELECT @StudentID = COALESCE(@StudentID + ',', '') + StudentID
FROM Student
WHERE StudentID IS NOT NULL and Condition='XYZ'
select @StudentID
8
Saloni

どちらの答えも有効ですが、変数の値を初期化することを忘れないでください。デフォルトではNULLであり、T-SQLを使用しています。

NULL + "Any text" => NULL

これは非常によくある間違いです。忘れないでください!

ISNULL関数を使用することもお勧めします。

SELECT @result = @result + ISNULL(StudentId + ',', '') FROM Student
7
Alex

変換エラーを回避するには、CONCAT関数を使用します。

DECLARE @StudentID VARCHAR(1000)
SELECT @StudentID = CONCAT(COALESCE(@StudentID + ',', ''), StudentID)
FROM Student
WHERE StudentID IS NOT NULL and Condition='XYZ'
select @StudentID
1
pistol-pete

または単一の選択ステートメント...

DECLARE @results VarChar(1000)
SELECT @results = CASE
     WHEN @results IS NULL THEN CONVERT( VarChar(20), [StudentId])
     ELSE ', ' + CONVERT( VarChar(20), [StudentId])
   END
FROM Student WHERE condition = abc;
0
brad.v

answer from brad.v は間違っています!連結された文字列は提供されません。

brad.v のようなものですが、1つの重要な変更を加えた正しいコードを次に示します。

DECLARE @results VarChar(1000)
  SELECT @results = CASE
     WHEN @results IS NULL THEN CONVERT( VarChar(20), [StudentId])
     ELSE @results + ', ' + CONVERT( VarChar(20), [StudentId])
  END
FROM Student WHERE condition = abc;

違いを見ます? :) brad.v あなたの答えを修正してください、私はそれを修正したりコメントしたりすることはできません。あなたが修正した後、私は私のものを削除できると思います。ありがとう!

0
Vadym Voznyuk

これはテーブルのNULL値で機能し、最後にサブストリング操作を必要としません。 COALESCEは、テーブル内のNULL値(実際に存在する場合)を適切に処理できません。

DECLARE @results VARCHAR(1000) = '' 
SELECT @results = @results + 
           ISNULL(CASE WHEN LEN(@results) = 0 THEN '' ELSE ',' END + [StudentId], '')
FROM Student WHERE condition = xyz

select @results
0
Gega Kakabadze