メモ:T-SQL 単一列の結果表をシンプルな JsonArray にしたい
create table [データ] ( [Id] bigint not null identity(1, 1) primary key , [Name] nvarchar(20) not null ) go insert into [データ] ([Name]) values (N'あいうえお') , (N'かきくけこ')
から
["あいうえお", "かきくけこ"]
にしたい場合のクエリ。
参考 SQL to JSON - array of objects to array of values in SQL 2016 - Stack Overflow
単純に for json だとダメ。
select [Name] from [データ] for json path
[{"Name":"あいうえお"},{"Name":"かきくけこ"}]
結果セットの行が配列の要素(object)になってしまう。
ojbect じゃなくて良ーんだよってことで、色々やります。
まず、'"' で囲って、 区切りの','付けて for xml で1行にまとめてしまう。
select concat(',', '"', [Name], '"') from [データ] for xml path('')
,"あいうえお","かきくけこ"
で、STUFF (Transact-SQL) - SQL Server | Microsoft Docs で 先頭の ',' を取る。
select stuff( (select concat(',', '"', [Name], '"') from [データ] for xml path('')) , 1, 1, '')
"あいうえお","かきくけこ"
後は、前後に '['、']' 付けたらOK!
select concat('[', stuff( (select concat(',', '"', [Name], '"') from [データ] for xml path('')) , 1, 1, ''), ']')
["あいうえお","かきくけこ"]
SQL Server 標準の JSON 機能使ってない?
では、正しい JSON かどうかだけチェックしときます。
JSON_QUERY (Transact-SQL) - SQL Server | Microsoft Docs
select json_query((select concat('[', stuff( (select concat(',', '"', [Name], '"') from [データ] for xml path('')) , 1, 1, ''), ']')))
["あいうえお","かきくけこ"]
JSON 機能素晴らしい?!