テーブルから列を選択し、結果を文字列に変換するステートメントを作成することはできますか?
理想的には、カンマ区切りの値が必要です。
たとえば、SELECT ステートメントが次のようになっているとします。
SELECT column
FROM table
WHERE column<10
結果は値を持つ列です
|column|
--------
| 1 |
| 3 |
| 5 |
| 9 |
結果として、文字列「1、3、5、9」が必要です
テーブルから列を選択し、結果を文字列に変換するステートメントを作成することはできますか?
理想的には、カンマ区切りの値が必要です。
たとえば、SELECT ステートメントが次のようになっているとします。
SELECT column
FROM table
WHERE column<10
結果は値を持つ列です
|column|
--------
| 1 |
| 3 |
| 5 |
| 9 |
結果として、文字列「1、3、5、9」が必要です
次のように実行できます。
declare @results varchar(500)
select @results = coalesce(@results + ',', '') + convert(varchar(12),col)
from t
order by col
select @results as results
| RESULTS |
-----------
| 1,3,5,9 |
select stuff(list,1,1,'')
from (
select ',' + cast(col1 as varchar(16)) as [text()]
from YourTable
for xml path('')
) as Sub(list)
SELECT CAST(<COLUMN Name> AS VARCHAR(3)) + ','
FROM <TABLE Name>
FOR XML PATH('')
現在受け入れられている回答は、複数のグループ化では機能しません。
列の行値のカテゴリを操作する必要がある場合は、これを試してください。
次のデータがあるとします。
+---------+-----------+
| column1 | column2 |
+---------+-----------+
| cat | Felon |
| cat | Purz |
| dog | Fido |
| dog | Beethoven |
| dog | Buddy |
| bird | Tweety |
+---------+-----------+
そして、これを出力として欲しい:
+------+----------------------+
| type | names |
+------+----------------------+
| cat | Felon,Purz |
| dog | Fido,Beethoven,Buddy |
| bird | Tweety |
+------+----------------------+
(フォローしている場合:
create table #column_to_list (column1 varchar(30), column2 varchar(30))
insert into #column_to_list
values
('cat','Felon'),
('cat','Purz'),
('dog','Fido'),
('dog','Beethoven'),
('dog','Buddy'),
('bird','Tweety')
)
ここで、すべての構文について説明するつもりはありませんが、ご覧のとおり、これで最初のトリックを実行できます。
select ',' + cast(column2 as varchar(255)) as [text()]
from #column_to_list sub
where column1 = 'dog'
for xml path('')
--Using "as [text()]" here is specific to the “for XML” line after our where clause and we can’t give a name to our selection, hence the weird column_name
出力:
+------------------------------------------+
| XML_F52E2B61-18A1-11d1-B105-00805F49916B |
+------------------------------------------+
| ,Fido,Beethoven,Buddy |
+------------------------------------------+
1 つのグループ (ここで、column1 = 'dog') のみであり、前にコンマが残っているという点で制限されており、さらに奇妙な名前が付けられていることがわかります。
したがって、最初に「stuff」関数を使用して先頭のコンマを処理し、列に stuff_list という名前を付けましょう。
select stuff([list],1,1,'') as stuff_list
from (select ',' + cast(column2 as varchar(255)) as [text()]
from #column_to_list sub
where column1 = 'dog'
for xml path('')
) sub_query([list])
--"sub_query([list])" just names our column as '[list]' so we can refer to it in the stuff function.
出力:
+----------------------+
| stuff_list |
+----------------------+
| Fido,Beethoven,Buddy |
+----------------------+
最後に、必要な column1 を定義する top_query エイリアスへの参照に注目して、これを select ステートメントに詰め込みましょう (ここでは 5 行目)。
select top_query.column1,
(select stuff([list],1,1,'') as stuff_list
from (select ',' + cast(column2 as varchar(255)) as [text()]
from #column_to_list sub
where sub.column1 = top_query.column1
for xml path('')
) sub_query([list])
) as pet_list
from #column_to_list top_query
group by column1
order by column1
出力:
+---------+----------------------+
| column1 | pet_list |
+---------+----------------------+
| bird | Tweety |
| cat | Felon,Purz |
| dog | Fido,Beethoven,Buddy |
+---------+----------------------+
これで完了です。
ここでもっと読むことができます:
ALTER PROCEDURE [dbo].[spConvertir_CampoACadena]( @nomb_tabla varchar(30),
@campo_tabla varchar(30),
@delimitador varchar(5),
@respuesta varchar(max) OUTPUT
)
AS
DECLARE @query varchar(1000),
@cadena varchar(500)
BEGIN
SET @query = 'SELECT @cadena = COALESCE(@cadena + '''+ @delimitador +''', '+ '''''' +') + '+ @campo_tabla + ' FROM '+@nomb_tabla
--select @query
EXEC(@query)
SET @respuesta = @cadena
END
次の方法を使用できます。
select
STUFF(
(
select ', ' + CONVERT(varchar(10), ID) FROM @temp
where ID<50
group by ID for xml path('')
), 1, 2, '') as IDs
Declare @temp Table(
ID int
)
insert into @temp
(ID)
values
(1)
insert into @temp
(ID)
values
(3)
insert into @temp
(ID)
values
(5)
insert into @temp
(ID)
values
(9)
select
STUFF(
(
select ', ' + CONVERT(varchar(10), ID) FROM @temp
where ID<50
group by ID for xml path('')
), 1, 2, '') as IDs
LISTAGG関数を使用します。SELECT LISTAGG(colmn) FROM table_name;