したがって、これはかなり標準的な要件です。住所情報を保持するテーブルがあり、すべてのフィールドがコンマ区切りで連結された単一の「書式設定された」住所を取得したいと考えています。
問題は、一部のフィールドが 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 (ただし、代わりにサブクエリを使用してクエリを簡単に書き直すことができます)。