Sql server 如何从SQL Server数据库中获取逗号分隔的单个地址,其中某些元素可能为空

Sql server 如何从SQL Server数据库中获取逗号分隔的单个地址,其中某些元素可能为空,sql-server,tsql,Sql Server,Tsql,所以这是一个相当标准的要求;我有一个保存地址信息的表,我想提取一个“格式化”地址,所有字段都用逗号分隔符连接 问题是有些字段可能是空的,因此我会以逗号结尾。例如,一个地址可能是“伦敦海滨10号”,末尾没有国家,但下一个地址可能是“英国伦敦舰队街5号”。如果我选择每个地址元素并假设它始终存在,那么我会将这两个地址表示为: 伦敦舰队街5号 英国伦敦斯特兰德街10号 从中间去掉多余的逗号很简单,只需测试NULL 我知道如何使用CTE或子查询在两次传递中修复尾部逗号问题,但这可以在一次传递数据中完成吗

所以这是一个相当标准的要求;我有一个保存地址信息的表,我想提取一个“格式化”地址,所有字段都用逗号分隔符连接

问题是有些字段可能是空的,因此我会以逗号结尾。例如,一个地址可能是“伦敦海滨10号”,末尾没有国家,但下一个地址可能是“英国伦敦舰队街5号”。如果我选择每个地址元素并假设它始终存在,那么我会将这两个地址表示为:

伦敦舰队街5号

英国伦敦斯特兰德街10号

从中间去掉多余的逗号很简单,只需测试NULL

我知道如何使用CTE或子查询在两次传递中修复尾部逗号问题,但这可以在一次传递数据中完成吗

以下是使用CTE的示例:

DECLARE @Address TABLE (
    Name VARCHAR(255),
    Line1 VARCHAR(255),
    Line2 VARCHAR(255),
    Line3 VARCHAR(255),
    City VARCHAR(255),
    Country VARCHAR(255));
INSERT INTO @Address VALUES ('Complete', 'Test 1', 'Test 2', 'Test 3', 'Oxford', 'England');
INSERT INTO @Address VALUES ('Incomplete', '22 Accacia', NULL, NULL, 'York', 'England');
INSERT INTO @Address VALUES ('Missing End', '10 Bond Street', NULL, NULL, 'London', NULL);
WITH Addresses AS
(
SELECT
    CASE WHEN Name IS NULL THEN '' ELSE Name + ', ' END + 
    CASE WHEN Line1 IS NULL THEN '' ELSE Line1 + ', ' END + 
    CASE WHEN Line2 IS NULL THEN '' ELSE Line2 + ', ' END + 
    CASE WHEN Line3 IS NULL THEN '' ELSE Line3 + ', ' END + 
    CASE WHEN City IS NULL THEN '' ELSE City + ', ' END + 
    CASE WHEN Country IS NULL THEN '' ELSE Country + ', ' END AS [Address]
FROM
    @Address)
SELECT LEFT([Address], LEN([Address]) - 1) AS [Address Clean] FROM Addresses;
这给了我:

Complete, Test 1, Test 2, Test 3, Oxford, England
Incomplete, 22 Accacia, York, England
Missing End, 10 Bond Street, London
我为什么要这个?部分原因是我想不出一种方法来实现这一点,但“感觉”应该有一种方法来获得我想要的,部分原因是此查询正在链接到SQL 2000 box的服务器上运行,因此我不能使用CTE(尽管我可以使用子查询轻松地重写查询)。

使用,例如:

WITH Addresses AS
(
SELECT
  coalesce(Name, '') + 
  coalesce(', ' + Line1, '') + 
  coalesce(', ' + Line2, '') + 
  coalesce(', ' + Line3, '') + 
  coalesce(', ' + City, '') + 
  coalesce(', ' + Country, '') AS [Address]
FROM
    @Address)
SELECT Address FROM Addresses
这将返回第一个非空参数,因此,例如,如果
Line1
为空,则将返回“”(否则
,Line1

请注意,要使其正常工作,必须在上设置为

根据试验数据得出的结果:

Complete, Test 1, Test 2, Test 3, Oxford, England
Incomplete, 22 Accacia, York, England
Missing End, 10 Bond Street, London

我在这里做了几件事。首先,我使用
ISNULL
确定值是否为
NULL
,如果是,则返回一个
'
(空字符串)。在测试之前,我将
,'
作为分隔符添加到值中,以查看它是否为
NULL
。这样,如果列为null,则列+分隔符也为
null
,并且
ISNULL
测试仍然返回
'
。我将分隔符放在列值之前,以便于删除额外的分隔符。如果额外的分隔符在字符串的末尾,那么我将不得不使用
LEN
函数或类似的函数来计算额外分隔符的位置。这样,它总是在字符串的开头,通过使用
STUFF
函数,我可以用
'
替换前2个字符,从而有效地删除它们

DECLARE @Address TABLE (
    Name VARCHAR(255),
    Line1 VARCHAR(255),
    Line2 VARCHAR(255),
    Line3 VARCHAR(255),
    City VARCHAR(255),
    Country VARCHAR(255));
INSERT INTO @Address VALUES ('Complete', 'Test 1', 'Test 2', 'Test 3', 'Oxford', 'England');
INSERT INTO @Address VALUES ('Incomplete', '22 Accacia', NULL, NULL, 'York', 'England');
INSERT INTO @Address VALUES ('Missing End', '10 Bond Street', NULL, NULL, 'London', NULL);

SELECT STUFF(
        ISNULL(', '+Name,'') + ISNULL(', '+Line1,'') + ISNULL(', '+Line2,'') + 
        ISNULL(', '+Line3,'') + ISNULL(', '+City,'') + ISNULL(', '+Country,'')
    ,1,2,'')
FROM @Address

您使用的是什么版本的SQL Server?能否重复此问题?在我看来,您已经回答了标题中的问题。因此,这是表示层渲染的标准要求。对于存储中的处理,没有那么多。在客户端上执行。这对尾部逗号有什么帮助?好吧,不过,你怎么假装去掉最后一个尾部逗号?你知道,就是让op向左执行
(column,LEN(column)-1)
?好吧,我的错:请看我的第二次编辑,逗号应该在字段前面。关于CONCAT_NULL_的注意事项很好。它经常被遗忘。太好了,我忘了东西。实际上,我最终使用了您的方法,因为它处理缺少的名称的效果比COALESCE方法略好。在这个特殊情况下,
COALESCE
ISNULL
几乎是等效的
ISNULL
只是我个人对单列测试的偏好@Geoff的版本只是缺少了
STUFF
命令(
SUBSTRING
LEFT
RIGHT
也可以根据您的设置方式工作。)另一方面,我没有提到
CONCAT\u NULL\u-NULL