4

したがって、これはかなり標準的な要件です。住所情報を保持するテーブルがあり、すべてのフィールドがコンマ区切りで連結された単一の「書式設定された」住所を取得したいと考えています。

問題は、一部のフィールドが NULL になる可能性があるため、末尾にカンマが付くことです。たとえば、ある住所は「10 The Strand, London」で末尾に国がない場合がありますが、次の住所は「5 Fleet Street, London, England」の場合があります。各アドレス要素を選択し、それが常に存在すると仮定すると、これら 2 つのアドレスは次のように表示されます。

「5 フリート ストリート、ロンドン、」

「10 ストランド、ロンドン、イングランド」

途中の余分なカンマを取り除くのは簡単で、NULL をテストするだけです。

CTE またはサブクエリを使用して、末尾のコンマの問題を 2 つのパスで修正する方法を知っていますが、これをデータの 1 回のパスで行うことはできますか?

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 ボックスに実行されているため、使用できないためです。 CTE (ただし、代わりにサブクエリを使用してクエリを簡単に書き直すことができます)。

4

2 に答える 2

12

coalesceたとえば、次のように使用します。

WITH Addresses AS
(
SELECT
  coalesce(Name, '') + 
  coalesce(', ' + Line1, '') + 
  coalesce(', ' + Line2, '') + 
  coalesce(', ' + Line3, '') + 
  coalesce(', ' + City, '') + 
  coalesce(', ' + Country, '') AS [Address]
FROM
    @Address)
SELECT Address FROM Addresses

これは、null ではない最初のパラメーターを返します。たとえば、Line1が null の場合は '' が返されます (そうでない場合,Line1)。

これが機能するには、CONCAT_NULL_YIELDS_NULLを に設定する必要があることに注意してくださいON

テストデータに対する結果:

Complete, Test 1, Test 2, Test 3, Oxford, England
Incomplete, 22 Accacia, York, England
Missing End, 10 Bond Street, London
于 2013-06-03T17:10:50.487 に答える
4

ここでいくつかのことを行いました。最初にISNULL、値がそうであるかどうかを判断し、そうであれば(空の文字列)NULLを返します。テストする前に、値に区切り文字として''を追加して、そうでないかどうかを確認しました。このように、列が null の場合、列 + 区切り文字も null であり、テストは引き続き を返します。列の値の前に区切り記号を付けて、余分な区切り記号を簡単に削除できるようにします。余分な区切り文字が文字列の末尾にある場合、関数などを使用して、余分な区切り文字がどこにあるかを計算する必要がありました。このようにして、常に文字列の先頭にあり、関数を使用することで、最初の 2 文字を効果的に削除することで置き換えることができます。', 'NULLNULLISNULL''LENSTUFF''

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
于 2013-06-03T17:26:17.063 に答える