次のクエリを作成しましたが、CASEステートメントが誤った値を返しています。soaddrがsoaddrから値を返す代わりに値を持っている場合、arcustから誤った値を返します。しかし、elseステートメントを変更してsoaddrから値をプルすると、NULL値が返されます。私は何が間違っているのですか?
SELECT DISTINCT a.custno, b.company,
CASE WHEN c.address1 = NULL THEN b.address1
ELSE b.address1
END as address,
CASE WHEN c.city = NULL THEN b.city
ELSE b.city
END as city,
CASE WHEN c.addrstate = NULL THEN b.addrstate
ELSE b.addrstate
END as addrstate,
CASE WHEN c.zip = NULL THEN b.zip
ELSE b.zip
END as zip,
invno, descrip, qtyshp, price, extprice, b.tax, invdte
FROM artran a
LEFT JOIN arcust b ON a.custno = b.custno
LEFT JOIN soaddr c ON a.custno = c.custno
間違った値を返す理由は、THEN&ELSEのすべての部分がアーカストを指すbテーブルエイリアスを参照するため、caseステートメントが常にアーカスト値を返すように設定されているためです。@ServerSentinelが適切に指摘しているように、その間とnullを誤って比較すると、目的の結果が得られません。次のようにクエリを変更して、cテーブルエイリアスをポイントし、nullをISNULLと比較します。
SELECT DISTINCT a.custno, b.company,
CASE WHEN c.address1 IS NULL THEN b.address1
ELSE c.address1
END as address,
CASE WHEN c.city IS NULL THEN b.city
ELSE c.city
END as city,
CASE WHEN c.addrstate IS NULL THEN b.addrstate
ELSE c.addrstate
END as addrstate,
CASE WHEN c.zip IS NULL THEN b.zip
ELSE c.zip
END as zip,
invno, descrip, qtyshp, price, extprice, b.tax, invdte
FROM artran a
LEFT JOIN arcust b ON a.custno = b.custno
LEFT JOIN soaddr c ON a.custno = c.custno
次にCOALESCE()を学習することは、基本的にcaseステートメントを記述し、最初のnull以外の値を返すため、ここで非常に役立ちます。したがって、次のように簡単に書くことができます。
SELECT DISTINCT a.custno, b.company,
COALESCE(c.address1,b.address1) as address,
COALESCE(c.city,b.city) as city,
COALESCE(c.addrstate,b.addrstate) as addrstate,
COALESCE(c.zip,b.zip) as zip,
invno, descrip, qtyshp, price, extprice, b.tax, invdte
FROM artran a
LEFT JOIN arcust b ON a.custno = b.custno
LEFT JOIN soaddr c ON a.custno = c.custno
nullでない場合は、soaddr列が表示され、nullでない場合は、アーカストアドレスが取得されます。
ただし、アドレスデータはおそらく一緒に保持する必要があるため、マージする可能性があるのではなく、1つのテーブルからアドレス全体を選択する必要がありますが、常に1つのフィールドをテストして、そのフィールドが一意のIDである必要があるsoaddrがあるかどうかを判断する必要がありますそのテーブルが存在する場合は、Address1などの別の列を使用しない場合。
SELECT DISTINCT a.custno, b.company,
CASE WHEN c.UniqueId IS NULL THEN b.address1
ELSE c.address1
END as address,
CASE WHEN c.UniqueId IS NULL THEN b.city
ELSE c.city
END as city,
CASE WHEN c.UniqueId IS NULL THEN b.addrstate
ELSE c.addrstate
END as addrstate,
CASE WHEN c.UniqueId IS NULL THEN b.zip
ELSE c.zip
END as zip,
invno, descrip, qtyshp, price, extprice, b.tax, invdte
FROM artran a
LEFT JOIN arcust b ON a.custno = b.custno
LEFT JOIN soaddr c ON a.custno = c.custno
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加