Sql server 如何获得&引用;而不是",;及;在SQL Server中的行中
我有一个1列的表测试Sql server 如何获得&引用;而不是",;及;在SQL Server中的行中,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个1列的表测试 Module_name Table Computer Laptop Chair 我的预期产出: Table,Computer,Laptop and Chair 我的问题是: declare @module_name varchar(50) SELECT @Module_Name = COALESCE(@Module_Name + ' and ', '') + module_name FROM (SELECT DISTINCT module_na
Module_name
Table
Computer
Laptop
Chair
我的预期产出:
Table,Computer,Laptop and Chair
我的问题是:
declare @module_name varchar(50)
SELECT @Module_Name = COALESCE(@Module_Name + ' and ', '') + module_name FROM
(SELECT DISTINCT module_name FROM Test) T
select @module_name
我得到的输出为:
Table and Computer and Laptop and Chair
我关心的是如何获得“,”而不是“,”您是否使用stuff()函数尝试过xml方法
declare @Module_names varchar(max)
set @Module_names = stuff((select distinct ',' +Module_name
from table t
for xml path('')),1,1, '')
select REVERSE(STUFF(REVERSE(@Module_names),
CHARINDEX(',', REVERSE(@Module_names)), 1,' dna ')) as Module_names
您是否使用stuff()
函数尝试过xml方法
declare @Module_names varchar(max)
set @Module_names = stuff((select distinct ',' +Module_name
from table t
for xml path('')),1,1, '')
select REVERSE(STUFF(REVERSE(@Module_names),
CHARINDEX(',', REVERSE(@Module_names)), 1,' dna ')) as Module_names
我不赞成这种解决方案,正如我在评论中所说,语法化应该在您的表示层中完成。。但是,您可以在SQL中实现这一点,如下所示:
编辑:轻微更新以满足单值返回
我不赞成这种解决方案,正如我在评论中所说,语法化应该在您的表示层中完成。。但是,您可以在SQL中实现这一点,如下所示:
编辑:轻微更新以满足单值返回
使用以下命令。首先用逗号收集所有记录,然后用“and”替换最后一个记录。必须确保您的列值不包含逗号,否则上次出现时会错放“and”
DECLARE @result VARCHAR(MAX) = STUFF(
(
SELECT DISTINCT
', ' + T.module_name
FROM
Test AS T
FOR XML
PATH('')
),
1, 2, '')
SET @result =
REVERSE(
STUFF( -- Replace
REVERSE(@result), -- ... in the reversed string
CHARINDEX(',', REVERSE(@result)), -- ... at the first position of the comma (the last one on the original string)
1, -- just 1 character (the comma)
'dna ') -- for the reversed " and"
)
SELECT @result
使用以下命令。首先用逗号收集所有记录,然后用“and”替换最后一个记录。必须确保您的列值不包含逗号,否则上次出现时会错放“and”
DECLARE @result VARCHAR(MAX) = STUFF(
(
SELECT DISTINCT
', ' + T.module_name
FROM
Test AS T
FOR XML
PATH('')
),
1, 2, '')
SET @result =
REVERSE(
STUFF( -- Replace
REVERSE(@result), -- ... in the reversed string
CHARINDEX(',', REVERSE(@result)), -- ... at the first position of the comma (the last one on the original string)
1, -- just 1 character (the comma)
'dna ') -- for the reversed " and"
)
SELECT @result
使用行号捕获最后一行
CREATE TABLE test
([Module_name] varchar(8))
;
INSERT INTO test
([Module_name])
VALUES
('Table'),
('Computer'),
('Laptop'),
('Chair')
;
SELECT STUFF((SELECT CASE WHEN RN = MAX(RN) OVER () THEN ' and ' ELSE ', ' END + Module_name
from
(
SELECT Module_name,
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RN
FROM test
) rns
ORDER BY RN
FOR XML PATH('')),1,2,'');
使用行号捕获最后一行
CREATE TABLE test
([Module_name] varchar(8))
;
INSERT INTO test
([Module_name])
VALUES
('Table'),
('Computer'),
('Laptop'),
('Chair')
;
SELECT STUFF((SELECT CASE WHEN RN = MAX(RN) OVER () THEN ' and ' ELSE ', ' END + Module_name
from
(
SELECT Module_name,
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RN
FROM test
) rns
ORDER BY RN
FOR XML PATH('')),1,2,'');
“语法化”应该在您的表示层中完成,而不是通过数据引擎。虽然有一种很糟糕的方法可以修改您当前的代码以生成您想要的输出,但请注意,您当前的技术是:“不要在SELECT语句中使用变量来连接值(…)。可能会出现意外的查询结果。这是因为选择列表(…)中的所有表达式不能保证对每个输出行执行一次。“语法化”应该在表示层中完成,而不是由数据引擎完成。尽管修改当前代码可能会有一种令人讨厌的方法来生成您要查找的输出,请注意,您当前的技术是:“不要在SELECT语句中使用变量连接值(…)。可能会出现意外的查询结果。这是因为SELECT列表(…)中的所有表达式不能保证对每个输出行执行一次”那么这将如何给出所需的输出呢?我相信他希望值用逗号分隔,直到最后一个,应该是“And”。我同意,这是一种比讨厌的自引用变量好得多的技术,然而,OP希望倒数第二个和最后一个值之间有”和“
”;它不是一个简单的分隔列表。他们希望“Grammarise”数据,而不是对其进行分隔。它是逗号分隔的输出,没有And。它仍然给我一个错误。Msg 189,15级,状态1,第6行charindex函数需要2到3个参数。这将如何给出所需的输出?我相信他希望在最后一个值之前用逗号分隔,应该是“And”“。我同意,这是一种比讨厌的自引用变量好得多的技术,但是,OP希望在倒数第二个和最后一个值之间有”和“
”;它不是一个简单的分隔列表。他们想要“Grammarise”数据,而不是对其进行分隔。它是逗号分隔的输出,没有And。它仍然给我一个错误。Msg 189,15级,状态1,第6行charindex函数需要2到3个参数。