Tsql T-SQL:在字符串连接中处理空值的最佳方法

Tsql T-SQL:在字符串连接中处理空值的最佳方法,tsql,null,string-concatenation,Tsql,Null,String Concatenation,如果在SELECT语句中,我正在选择一个使用我从中选择的表中的值的连接字符串,那么处理这些值的空值的最佳方法是什么,以便我仍然拥有我的字符串?如中所示,如果我要为用户选择城市、州和国家,并且我想要第三个字段将它们全部连接起来: SELECT City, State, Country, City + ', ' + State + ', ' + Country AS 'Location' FROM Users 但是,如果这三个字段中的任何一个为空,则“Location”为空,这在用户不是美国人时发

如果在SELECT语句中,我正在选择一个使用我从中选择的表中的值的连接字符串,那么处理这些值的空值的最佳方法是什么,以便我仍然拥有我的字符串?如中所示,如果我要为用户选择城市、州和国家,并且我想要第三个字段将它们全部连接起来:

SELECT City, State, Country,
City + ', ' + State + ', ' + Country AS 'Location'
FROM Users
但是,如果这三个字段中的任何一个为空,则“Location”为空,这在用户不是美国人时发生

我目前的解决方案是:

SELECT City, State, Country,
City + ', ' + COALESCE(State + ', ', '') + Country AS 'Location'
FROM Users

但我不确定这是否只是一次黑客攻击,是否有更好的方法。想法?

是的,这是一条路要走。您也可以使用isnull,但coalesce更为标准。你可能会考虑如果你在城市或国家可能有空缺。您还可以考虑用户可能有多个PLE地址,并且可能有一个以上的城市、州、国家,也许相关的表会更好地用于这个信息。

< P>在每两个字段之间用逗号预测正确,您可以使用这个表格

;with users(City, State, Country) as (
select 'a', null, 'c' union all
select 'a', 'b', 'c' union all
select null, null, 'c')

-- ignore above this line
SELECT City, State, Country,
    STUFF(
        ISNULL(', ' + City, '')+
        ISNULL(', ' + State, '')+
        ISNULL(', ' + Country, ''), 1, 2, '') AS 'Location'
FROM Users
输出

City State Country Location
---- ----- ------- --------
a    NULL  c       a, c
a    b     c       a, b, c
NULL NULL  c       c

您可以在SQL 2012及更高版本中使用Concat函数

SELECT City, State, Country,
Concat(City, ', ', State, ', ', Country) AS 'Location'
FROM Users

联合是这方面的标准做法。在您的情况下,您只需要isnull即可。可能重复的btw@bzlm哎呀!你说得对。不知道为什么在我搜索或输入标题时它没有出现。也许是因为我特别提出了t-sql。投票结束。投票结束自己的问题总是有点奇怪。“这让人发痒。”bzlm重复问题的答案并没有让我兴奋。它不处理列之间的分隔符。@cyberkiwiold并不意味着过时。也在那里张贴您的精美CTE:@bzlm CTE只是为了让查询工作。。并产生说明性输出。查询实际上是没有CTE的部分。是否更标准?需要引用。@bzlm:虽然我不想说它在采用率方面更标准,但它通常是新开发的首选语法,因为它涵盖了ISNULL涵盖的所有情况,以及其他链接附加选项(例如,需要多个ISNULL语句)的情况。另外,COALESCE在SqlCE上可用,而ISNULL不可用。@Adam,@Bzlm除非我们处理SqlCE,否则拖出它没有意义。顺便说一句,与IsNull相比,COALESCE存在一些动态类型和性能问题,因此如果您使用的是SQL Server非CE,并且只需要2个值,请不要不必要地冒险使用COALESCE。COALESCE是ISO标准,IsNull是特定于SQL Server的。@bzlm,@cyberwiki:此外,COALESCE是ANSI-92 SQL的一部分,IsNull不是。+1;我没有考虑中间值为空的可能性,这在事后看来似乎很明显。@Adam上帝保佑20/20后见之明!我有点困惑——这一行上面的内容忽略了吗?@Joe CTE WITH子句允许您虚拟地定义一个表或多个表,以便在紧接着的查询SELECT中使用。您不需要它,只需在-ignore行之后使用查询即可。我用它来为SELECT查询定义一个表,而不是创建一个临时表。这就像魔术般的lol,我一直在尝试为较旧的sql解决这个问题,而不是使用concat_ws函数,除非数据库的版本早于2012年,否则我会使用它。
;WITH 

users(City, State, Country) AS (
  SELECT    'a',
            null,
            'c' 
  UNION     ALL
  SELECT    'a',
            'b', 
            'c' 
  UNION     ALL
  SELECT    null,
            null, 
            'c'
)

SELECT      City, 
            State,
            Country,
            CONCAT(City+', ' ,State+', ', Country) AS Location
FROM        Users