18

SQLServerに次のようなテーブルがあるとします。

Id    City           Province             Country
1     Vancouver      British Columbia     Canada
2     New York       null                 null
3     null           Adama                null
4     null           null                 France
5     Winnepeg       Manitoba             null
6     null           Quebec               Canada
7     Seattle        null                 USA 

場所が「、」で区切られた市、県、国の連結であり、nullが省略されているように、クエリ結果を取得するにはどうすればよいですか。末尾のカンマ、先行するカンマ、または空の文字列がないことを確認したいと思います。例えば:

Id    Location
1     Vancouver, British Columbia, Canada
2     New York
3     Adama
4     France
5     Winnepeg, Manitoba
6     Quebec, Canada
7     Seattle, USA
4

6 に答える 6

39

これにより、他の回答で見つけたすべての問題が解決されると思います。出力の長さをテストしたり、先頭の文字がカンマであるかどうかを確認したりする必要はありません。文字列以外の型を連結することを心配する必要はありません。他の列 (郵便番号など) が必然的に追加されたときに複雑さが大幅に増加することもありません...

DECLARE @x TABLE(Id INT, City VARCHAR(32), Province VARCHAR(32), Country VARCHAR(32));

INSERT @x(Id, City, Province, Country) VALUES
(1,'Vancouver','British Columbia','Canada'),
(2,'New York' , null             , null   ),
(3, null      ,'Adama'           , null   ),
(4, null      , null             ,'France'),
(5,'Winnepeg' ,'Manitoba'        , null   ),
(6, null      ,'Quebec'          ,'Canada'),
(7,'Seattle'  , null             ,'USA'   );

SELECT Id, Location = STUFF(
      COALESCE(', ' + RTRIM(City),     '') 
    + COALESCE(', ' + RTRIM(Province), '') 
    + COALESCE(', ' + RTRIM(Country),  '')
    , 1, 2, '')
  FROM @x;

SQL Server 2012 は と呼ばれる新しい T-SQL 関数を追加しましたCONCATが、検出された値の間にオプションでコンマを含める必要があり、それを行う機能がないため、ここでは役に立ちません。セパレーター。これにより、非文字列型について心配する必要がなくなりますが、null と非 null を非常にエレガントに処理することはできません。

于 2012-07-05T19:55:27.800 に答える
10
select Id ,   
 Coalesce( City + ',' +Province + ',' + Country,
           City+ ',' + Province,
           Province + ',' + Country,
           City+ ',' + Country,
           City,
           Province,
           Country
          ) as location
from table
于 2012-07-05T19:33:56.123 に答える
5

コンマが間に入る必要があるため、これは難しい問題です。

select id, coalesce(city+', ', '')+coalesce(province+', ', '')+coalesce(country, '')
from t

動作するはずですが、country が NULL の場合など、最後に余分なコンマが付くことがあります。したがって、もう少し複雑にする必要があります。

select id,
       (case when right(val, 2) = ', ' then left(val, len(val) - 1)
             else val
        end) as val
from (select id, coalesce(city+', ', '')+coalesce(province+', ', '')+coalesce(country, '') as val
      from t
     ) t

多くの中間ロジックがなければ、最も簡単な方法は、各要素にコンマを追加し、最後に余分なコンマを削除することだと思います.

于 2012-07-05T19:30:15.027 に答える
2

「+」演算子を使用します。

null 値は '+' 演算子では機能しないことを理解してください (例: 'Winnepeg' + null = null)。そのため、必ず ISNULL() または COALESCE() 関数を使用して null を空の文字列に置き換えてください。例: ISNULL('Winnepeg','') + ISNULL(null,'')。

また、列の 1 つが数値として解釈される可能性が少しでもある場合は、エラーの戻りを避けるために CAST() 関数も使用してください。例: CAST('Winnepeg' as varchar( 100)))。

これまでの例のほとんどは、これの 1 つ以上を無視しています。また、いくつかの例では、サブクエリを使用したり、長さチェックを行ったりしますが、これは実際には行うべきではありませんが、必要ではありませんが、オプティマイザはとにかくあなたを救うかもしれません。

幸運を

于 2012-07-05T19:44:13.107 に答える
1

醜いですが、MS SQLでは機能します:

    select
    id,
    case
        when right(rtrim(coalesce(city + ', ','') + coalesce(province + ', ','') + coalesce(country,'')),1)=',' then left(rtrim(coalesce(city + ', ','') + coalesce(province + ', ','') + coalesce(country,'')),LEN(rtrim(coalesce(city + ', ','') + coalesce(province + ', ','') + coalesce(country,'')))-1)
        else rtrim(coalesce(city + ', ','') + coalesce(province + ', ','') + coalesce(country,''))
    end
from
    table
于 2012-07-05T19:39:44.650 に答える
-2

ここにオプションがあります:

SELECT (CASE WHEN City IS NULL THEN '' ELSE City + ', ' END) + 
(CASE WHEN Province IS NULL THEN '' ELSE Province + ', ' END) +
(CASE WHEN Country IS NULL THEN '' ELSE Country END) AS LOCATION
FROM MYTABLE
于 2012-07-05T19:24:19.983 に答える