Where句のINにSQLで取得した結果を直接利用したりするのに、SQLServerで複数件存在するデータを1行のカンマ区切りのデータとして取得して見ます。
SQLの取得結果をカンマ区切りで取得
Where句のINにSQLで取得した結果を直接利用したりするのに、SQLServerで複数件存在するデータを1行のカンマ区切りのデータとして取得して見ます。
(残念ですがOracleやMySQLなどではこの方法は通用しません。)
取得
カンマ区切りで取得するには列名を「data()」にすることでアトミック値として処理し、その結果を「FOR XML PATH」を利用して細工します。
CREATE TABLE test_table
(
no SMALLINT
,name VARCHAR(20)
)
INSERT INTO test_table VALUES( 1,'太郎さん' )
INSERT INTO test_table VALUES( 2,'次郎さん' )
INSERT INTO test_table VALUES( 3,'三郎さん' )
SELECT REPLACE(
( SELECT
name AS [data()]
FROM
test_table
FOR XML PATH ('')), ' ', ',') AS RESULT
取得結果
| RESULT |
|---|
| 太郎さん,次郎さん,三郎さん |
取得した結果でカンマ区切り (CSV)ファイルを作成するには便利です。
補足
カラムに付けている別名「data()」ですが、
パスを data() として指定した列の名前を参照すると
列名として指定したパスが “data()” の場合、生成されるXMLでは列の値がアトミック値として処理されます。
とあり、「data()」を他の名称「aaa()」のように変えると
| RESULT |
|---|
| 太郎さん |
| 次郎さん |
| 三郎さん |
のように普通に取得してしまいます。
不可分操作 - Wikipedia
不可分操作(ふかぶんそうさ)あるいはアトミック操作 (Atomic Operation) とは、情報工学においていくつかの操作を組み合わせたもので、システムの他の部分から見てそれらがひとつの操作に見えるものをいう。
と言うことで、SELECT結果が複数件あっても1つの操作の結果に見えると。
う~ん、難しい。
