SQLCASEが間違った値を返す

user3394606

次のクエリを作成しましたが、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]

編集
0

コメントを追加

0

関連記事

分類Dev

dateDiffが間違った値を返す

分類Dev

GoogleAPIが間違った値を返す

分類Dev

DateTimediffが間違った値を返す

分類Dev

Datetime()が間違った値を返す

分類Dev

strcmpが間違った値を返す

分類Dev

ArrayFieldが間違った値を返す

分類Dev

AndroidListPreferenceが間違った値を返す

分類Dev

getDateが間違った値を返す

分類Dev

SharedPreferencesが間違った値を返す

分類Dev

SQLCASEの間違った出力

分類Dev

間違った値を返すOmp

分類Dev

MYSQL検索が間違った重複した値を返す

分類Dev

Sum要素が間違った値を返す配列です

分類Dev

request.getScheme()メソッドが間違った値を返す

分類Dev

toInstant()javaが間違った値を返します

分類Dev

toInstant()javaが間違った値を返します

分類Dev

スキャナーが間違ったint値を返す

分類Dev

JavascriptString.fromCharCodeが間違った値を返す

分類Dev

Boolメソッドが間違った値を返す

分類Dev

CKContaineraccountStatusWithCompletionHandlerが間違った値を返します

分類Dev

LEN()がVBAで間違った値を返す

分類Dev

application.ymlからの@Valueが間違った値を返す

分類Dev

スポックモックが間違った値を返す

分類Dev

スイッチが間違った値を返す

分類Dev

NSLocaleがiOS11で間違った値を返す

分類Dev

Tan()関数が間違った値を返す

分類Dev

合計関数が間違った値を返す

分類Dev

firstRect(for :)がUITextFieldに間違った値を返す

分類Dev

NSLocale.current.languageが間違った値を返す

Related 関連記事

ホットタグ

アーカイブ