SQL Server 转换选择一列并将其转换为字符串
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16193152/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
SQL Server convert select a column and convert it to a string
提问by eddy ed
Is it possible to write a statement that selects a column from a table and converts the results to a string?
是否可以编写从表中选择列并将结果转换为字符串的语句?
Ideally I would want to have comma separated values.
理想情况下,我希望有逗号分隔值。
For example, say that the SELECT statement looks something like
例如,假设 SELECT 语句看起来像
SELECT column
FROM table
WHERE column<10
and the result is a column with values
结果是一个带有值的列
|column|
--------
| 1 |
| 3 |
| 5 |
| 9 |
I want as a result the string "1, 3, 5, 9"
结果我想要字符串 "1, 3, 5, 9"
回答by Kaf
You can do it like this:
你可以这样做:
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 |
回答by Andomar
select stuff(list,1,1,'')
from (
select ',' + cast(col1 as varchar(16)) as [text()]
from YourTable
for xml path('')
) as Sub(list)
回答by jkalamarz
There is new method in SQL Server 2017:
SQL Server 2017 中有一个新方法:
SELECT STRING_AGG (column, ',') AS column FROM Table;
SELECT STRING_AGG (column, ',') AS column FROM Table;
that will produce 1,3,5,9
for you
那会1,3,5,9
为你生产
回答by Mohammad Foolady
SELECT CAST(<COLUMN Name> AS VARCHAR(3)) + ','
FROM <TABLE Name>
FOR XML PATH('')
回答by ColinMac
The current accepted answer doesn't work for multiple groupings.
Try this when you need to operate on categories of column row-values.
当前接受的答案不适用于多个分组。
当您需要对列行值的类别进行操作时,请尝试此操作。
Suppose I have the following data:
假设我有以下数据:
+---------+-----------+
| column1 | column2 |
+---------+-----------+
| cat | Felon |
| cat | Purz |
| dog | Fido |
| dog | Beethoven |
| dog | Buddy |
| bird | Tweety |
+---------+-----------+
And I want this as my output:
我希望这是我的输出:
+------+----------------------+
| type | names |
+------+----------------------+
| cat | Felon,Purz |
| dog | Fido,Beethoven,Buddy |
| bird | Tweety |
+------+----------------------+
(If you're following along:
(如果您正在关注:
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')
)
)
Now – I don't want to go into all the syntax, but as you can see, this does the initial trick for us:
现在——我不想深入研究所有的语法,但正如你所看到的,这对我们来说是一个初步的技巧:
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
output:
输出:
+------------------------------------------+
| XML_F52E2B61-18A1-11d1-B105-00805F49916B |
+------------------------------------------+
| ,Fido,Beethoven,Buddy |
+------------------------------------------+
You can see it's limited in that it was for just one grouping (where column1 = ‘dog') and it left a comma in the front, and additionally it's named weird.
你可以看到它的局限性在于它只用于一个分组(其中 column1 = 'dog')并且它在前面留下了一个逗号,另外它被命名为奇怪的。
So, first let's handle the leading comma using the 'stuff' function and name our column stuff_list:
因此,首先让我们使用 '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.
Output:
输出:
+----------------------+
| stuff_list |
+----------------------+
| Fido,Beethoven,Buddy |
+----------------------+
Finally let's just mush this into a select statement, noting the reference to the top_query alias defining which column1 we want (on the 5th line here):
最后,让我们将其合并到一个 select 语句中,注意对定义我们想要的 column1 的 top_query 别名的引用(在此处的第 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
output:
输出:
+---------+----------------------+
| column1 | pet_list |
+---------+----------------------+
| bird | Tweety |
| cat | Felon,Purz |
| dog | Fido,Beethoven,Buddy |
+---------+----------------------+
And we're done.
我们已经完成了。
You can read more here:
你可以在这里阅读更多:
回答by Rob Peterson
This a stab at creating a reusable column to comma separated string. In this case, I only one strings that have values and I do not want empty strings or nulls.
这是创建可重用列到逗号分隔字符串的尝试。在这种情况下,我只有一个有值的字符串,我不想要空字符串或空值。
First I create a user defined type that is a one column table.
首先,我创建一个用户定义的类型,它是一个单列表。
-- ================================
-- Create User-defined Table Type
-- ================================
USE [RSINET.MVC]
GO
-- Create the data type
CREATE TYPE [dbo].[SingleVarcharColumn] AS TABLE
(
data NVARCHAR(max)
)
GO
The real purpose of the type is to simplify creating a scalar function to put the column into comma separated values.
该类型的真正目的是简化创建标量函数以将列放入逗号分隔值的过程。
-- ================================================
-- Template generated from Template Explorer using:
-- Create Scalar Function (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- This block of comments will not be included in
-- the definition of the function.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Rob Peterson
-- Create date: 8-26-2015
-- Description: This will take a single varchar column and convert it to
-- comma separated values.
-- =============================================
CREATE FUNCTION fnGetCommaSeparatedString
(
-- Add the parameters for the function here
@column AS [dbo].[SingleVarcharColumn] READONLY
)
RETURNS VARCHAR(max)
AS
BEGIN
-- Declare the return variable here
DECLARE @result VARCHAR(MAX)
DECLARE @current VARCHAR(MAX)
DECLARE @counter INT
DECLARE @c CURSOR
SET @result = ''
SET @counter = 0
-- Add the T-SQL statements to compute the return value here
SET @c = CURSOR FAST_FORWARD
FOR SELECT COALESCE(data,'') FROM @column
OPEN @c
FETCH NEXT FROM @c
INTO @current
WHILE @@FETCH_STATUS = 0
BEGIN
IF @result <> '' AND @current <> '' SET @result = @result + ',' + @current
IF @result = '' AND @current <> '' SET @result = @current
FETCH NEXT FROM @c
INTO @current
END
CLOSE @c
DEALLOCATE @c
-- Return the result of the function
RETURN @result
END
GO
Now, to use this. I select the column I want to convert to a comma separated string into the SingleVarcharColumn Type.
现在,使用这个。我选择要转换为逗号分隔字符串的列到 SingleVarcharColumn 类型中。
DECLARE @s as SingleVarcharColumn
INSERT INTO @s VALUES ('rob')
INSERT INTO @s VALUES ('paul')
INSERT INTO @s VALUES ('james')
INSERT INTO @s VALUES (null)
INSERT INTO @s
SELECT iClientID FROM [dbo].tClient
SELECT [dbo].fnGetCommaSeparatedString(@s)
To get results like this.
得到这样的结果。
rob,paul,james,1,9,10,11,12,13,14,15,16,18,19,23,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,44,45,46,47,48,49,50,52,53,54,56,57,59,60,61,62,63,64,65,66,67,68,69,70,71,72,74,75,76,77,78,81,82,83,84,87,88,90,91,92,93,94,98,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,120,121,122,123,124,125,126,127,128,129,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159
抢,保罗,詹姆斯,1,9,10,11,12,13,14,15,16,18,19,23,26,27,28,29,30,31,32,34,35,36, 37,38,39,40,41,42,44,45,46,47,48,49,50,52,53,54,56,57,59,60,61,62,63,64,65, 66,67,68,69,70,71,72,74,75,76,77,78,81,82,83,84,87,88,90,91,92,93,94,98,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,120,121,122,123,124,125,126,127,128,129,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159
I made my data column in my SingleVarcharColumn type an NVARCHAR(MAX) which may hurt performance, but I flexibility was what I was looking for and it runs fast enough for my purposes. It would probably be faster if it were a varchar and if it had a fixed and smaller width, but I have not tested it.
我将 SingleVarcharColumn 类型中的数据列设为 NVARCHAR(MAX),这可能会影响性能,但我一直在寻找灵活性,并且它运行速度足以满足我的目的。如果它是一个 varchar 并且它有一个固定的和更小的宽度,它可能会更快,但我没有测试过它。
回答by Muhammad Awais
You can use the following method:
您可以使用以下方法:
select
STUFF(
(
select ', ' + CONVERT(varchar(10), ID) FROM @temp
where ID<50
group by ID for xml path('')
), 1, 2, '') as IDs
Implementation:
执行:
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
Result will be:
结果将是:
回答by Huacho
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
回答by Ankit Saini
Use simplest way of doing this-
使用最简单的方法来做到这一点 -
SELECT GROUP_CONCAT(Column) from table
回答by krishna prabha raveendran
Use LISTAGGfunction,
ex. SELECT LISTAGG(colmn) FROM table_name;
使用LISTAGG函数,例如。SELECT LISTAGG(colmn) FROM table_name;