31

テーブルから列を選択し、結果を文字列に変換するステートメントを作成することはできますか?

理想的には、カンマ区切りの値が必要です。

たとえば、SELECT ステートメントが次のようになっているとします。

SELECT column
FROM table
WHERE column<10

結果は値を持つ列です

|column|
--------
|  1   |
|  3   |
|  5   |
|  9   |

結果として、文字列「1、3、5、9」が必要です

4

11 に答える 11

71

次のように実行できます。

フィドルのデモ

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 |
于 2013-04-24T13:27:32.413 に答える
12
select  stuff(list,1,1,'')
from    (
        select  ',' + cast(col1 as varchar(16)) as [text()]
        from    YourTable
        for     xml path('')
        ) as Sub(list)

SQL Fiddle の例。

于 2013-04-24T13:26:04.533 に答える
4
SELECT  CAST(<COLUMN Name> AS VARCHAR(3)) + ','
FROM    <TABLE Name>
FOR     XML PATH('')
于 2016-08-15T11:01:35.670 に答える
3

現在受け入れられている回答は、複数のグループ化では機能しません。
列の行値のカテゴリを操作する必要がある場合は、これを試してください。

次のデータがあるとします。

+---------+-----------+
| 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 |
+---------+----------------------+

これで完了です。

ここでもっと読むことができます:

于 2018-09-06T22:02:17.130 に答える
0
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
于 2014-09-25T19:44:26.647 に答える
0

次の方法を使用できます。

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

結果は次のようになります。

ここに画像の説明を入力

于 2017-08-29T09:41:22.003 に答える
-1

LISTAGG関数を使用します。SELECT LISTAGG(colmn) FROM table_name;

于 2020-02-22T09:44:27.870 に答える