连接,带分隔符,其中任何输入字段组合都可能为空

GWR*_*GWR 5 sql-server

我有三列,CITY, STATE, COUNTRY。一列、两列或所有列可能为 NULL。

通过以下逻辑,使用下面的 SQL 生成单个字符串。很乱,想知道有没有更简单的方法来实现输出?我考虑过 CONCAT() 但我不认为我可以使用它并且仍然在那里获得分隔符。

  • 如果 CITY 和 STATE 都有值,请使用该值,以', '.分隔。排除国家。
  • 如果仅存在 CITY 或 STATE 之一,且存在 AND Country,则使用存在的 CITY/STATE 之一,加上分隔符和 COUNTRY。
  • 如果 CITY 或 STATE 都不存在,则仅使用不带分隔符的国家/地区
  • 如果仅存在三个中的一个,则按原样使用它,不带分隔符
  • 如果不存在,则输出应为 NULL (not '')

我要补充一点,如果 CITY 和/或 STATE 值存在,那么 COUNTRY 永远不会为 NULL。

这是到目前为止的代码。它很乱,但我相信它满足上面列出的输出要求。

我正在使用 SQL Server 2008。

CASE WHEN 
    CASE WHEN ISNULL(M.CITY, '') = '' THEN  '' ELSE ISNULL(M.CITY, '') + ', ' END + CASE WHEN ISNULL(M.PROVINCE, '') = '' THEN  '' ELSE ISNULL(M.PROVINCE, '') END

     = '' THEN CASE WHEN COUNTRY IS NOT NULL THEN COUNTRY ELSE NULL END ELSE 

     CASE WHEN ISNULL(M.CITY, '') = '' THEN  '' ELSE ISNULL(M.CITY, '') + ', ' END + CASE WHEN ISNULL(M.PROVINCE, '') = '' THEN  '' ELSE ISNULL(M.PROVINCE, '') END 
END 
+ 
CASE
    WHEN (M.CITY IS NULL AND M.PROVINCE IS NOT NULL) OR (M.CITY IS NOT NULL AND M.PROVINCE IS NULL) THEN 
        CASE WHEN PROVINCE IS NOT NULL AND CITY IS NULL THEN ', ' ELSE '' END + COUNTRY
    ELSE '' 
END 
LOCATION 
Run Code Online (Sandbox Code Playgroud)

小智 13

这能满足您的需求吗?

select coalesce(city + ', ' + state, 
                city + ', ' + country, 
                state + ', ' + country, 
                country, 
                state, 
                city) as location
Run Code Online (Sandbox Code Playgroud)

如果您 100% 确定以下内容也成立(如果有限制条件可以确定):

我要补充一点,如果 CITY 和/或 STATE 值存在,那么 COUNTRY 永远不会为 NULL。

那么最后两个参数也可以省略:

select coalesce(city + ', ' + state, 
                city + ', ' + country, 
                state + ', ' + country, 
                country) 
Run Code Online (Sandbox Code Playgroud)