2017-11-01 6 views
0
SELECT bill.bill_id, bill.bill_ref 
FROM bill 
LEFT JOIN bill_item ON (bill.bill_id = bill_item.bill_id) 
WHERE bill_item.job_sales_id = :job_sales_id and 
     bill.billing_type = "INV" 

私は自分の条件に以下を追加したい:SQL SELECTフィールドが空でない場合にのみ

IF bill.bill_ref = "", 
bill.bill_ref NOT IN 
(SELECT cn_inv FROM bill a WHERE a.billing_type = "CN") 

どのように私はそれをコーディングする必要がありますか?

bill table: 
bill_id | bill_ref | billing_type | cn_inv 
--------+----------+--------------+------- 
1  | INV001 | INV   | 
2  |   | INV   | 
3  | INV002 | INV   | 
4  | CN001 | CN   | INV002 
------------------------------------------ 
bill_item table: 
bill_id | item_code | sales_id 
--------+-----------+---------- 
1  | item001 | 10 
1  | item002 | 11 
2  | item001 | 13 
3  | item001 | 13 
4  | item001 | 13 

が与えられた場合:
sales_idが13である、をrowCountはに等しい戻り0
sales_id 10である、をrowCountはに等しい戻り1.
sales_id 11である、をrowCountは0

+1

使用 'NULL' –

+0

ところで、質問の見出しではなく、あなたが実際に頼まは、2つの異なるものです。 –

+1

WHERE句 'bill_item.job_sales_id ='の条件は、そのカラムが非NULLである必要があり、LEFT JOINの「外側」を無効にし、INNER結合と同等にします。実際に外部結合が必要な場合は、WHERE句の条件をON句に再配置します。 – spencer7593

答えて

3

に等しい戻りどのような結果が返されるはずです。指定がの場合、一致する行がbillにある行を除外すると、相関サブクエリとともにNOT EXISTSを使用できます。これはbill_refのためにNULL値を持つ行を除外することを

我々は唯一bill_refが非NULLではなく空の文字列であるとき、除外は適用したい場合は...

SELECT b.bill_id 
     , b.bill_ref 
    FROM bill b 
    JOIN bill_item i 
     ON i.bill_id = b.bill_id 
    AND i.job_sales_id = :job_sales_id 
    WHERE b.billing_type = 'INV' 
    AND b.bill_ref IS NOT NULL 
    AND NOT EXISTS (SELECT 1 
         FROM bill a 
         WHERE a.cn_inv  = b.bill_ref 
         AND a.cn_inv  <> '' 
         AND a.billing_type = 'CN' 
        ) 

注意。 bill_refのNULL値を持つ行が返されるように、クエリを調整することができます。

我々はまた、条件がbill_itemテーブルからjob_sales_idを必要とWHERE句であります、OPのクエリでは...と同等の結果を返すために

SELECT b.bill_id 
     , b.bill_ref 
    FROM bill b 
    JOIN bill_item i 
     ON i.bill_id = b.bill_id 
    AND i.job_sales_id = :job_sales_id 
     -- anti-join exclude rows that have a match 
    LEFT 
    JOIN bill a 
     ON a.billing_type = 'CN' 
    AND a.cn_inv  <> '' 
    AND a.cn_inv  = b.bill_ref 
    WHERE a.cn_inv IS NULL 
    AND b.billing_type = 'INV' 
    AND b.bill_ref IS NOT NULL 

を抗加入パターンを使用することができますNULLでない。この条件は、LEFT結合の「外側」を否定します。つまり、INNER結合と同じです。

この回答のクエリは、その動作を保持します。 (bill_itemへの参加のために取り外さLEFTキーワードで、我々はON句にWHERE句から条件を再配置することができます。)

+0

ありがとう!私のニーズに非常に近いあなたのもの! b.bill_refが空の文字列になることがありますか? b.bill_refがヌルでない場合、b.bill_refがカラムcn_invに存在しないことを確認するだけです。 – ShirleyKuanSF

+1

@ShirleyKuanSF:WHERE句(どちらのクエリでも)から 'b.bill_ref IS NOT NULL'条件を削除してください。 NULL値の '='(等しい比較)はNULLと評価されます。すなわち 'foo = NULL'は決して真ではありません。長さゼロの文字列で特殊なケースがない場合は、 'a.cn_inv <> '' '条件を削除してください。 (サンプルのデータサンプルデータを提供し、予想される出力は仕様を説明するのに役立ちます) – spencer7593

+0

OPがこの回答が正しいことを確認することを歓迎しています。ニースと記述的な解決策。+ 1。(私の答えを削除しました) –

関連する問題