2015-12-15 73 views
0

我試圖使用作爲客戶代碼的輸入變量來檢索數據。如果用戶輸入客戶代碼,查詢將檢索該客戶數據,但如果用戶將客戶代碼留空,我想檢索所有客戶數據。以下是我可以根據'3_customer'中的客戶代碼輸入檢索數據的代碼,但我無法弄清楚如何執行此IF-THEN-ELSE類型的查詢,我需要爲所有客戶獲取數據(如果輸入變量留空。SQL - 選擇基於一個特定輸入值的數據或全部輸入值(如果沒有輸入值)

謝謝, 唐

SELECT 
    open_item.order_id order_id, 
    convert(varchar(10),orders.ordered_date,101) order_date, 
    orders.revenue_code_id, 
    orders.operations_user, 
    open_item.customer_id cust_no, 
    customer.name cust_name, 
    convert(varchar(10),open_item.gl_date,101) adjust_date, 
    open_item.amount amount, 
    open_item.record_type type, 
    open_item.ar_reason_code_id, 
    ar_reason_code.descr reason 
FROM 
    open_item 
LEFT OUTER JOIN 
    customer ON customer.id = open_item.customer_id 
LEFT OUTER JOIN 
    ar_reason_code ON open_item.ar_reason_code_id = ar_reason_code.id 
LEFT OUTER JOIN 
    orders ON orders.id = open_item.order_id 
WHERE 
    open_item.gl_date >= $1_sdate$ AND 
    open_item.gl_date <= $2_edate$ AND 
    open_item.source = 'C' AND 
    open_item.record_type = 'C' AND 
    open_item.customer_id = $3_customer$ 
+2

這是什麼數據庫? – Ruslan

+0

@Ruslan:看起來像SQL Server –

+0

那麼customer_ID可以是「Blank」/ empty set而不是NULL嗎?或者customer.id中可能有非顯示字符? – xQbert

回答

1

你需要稍微爲客戶條件WHERE條款從:

and open_item.customer_id = $3_customer$ 

到這樣的事情:(下面的代碼自帶的假設即$3_customer$正被插入到查詢字符串中,並且如果爲空將被設置爲NULL

and ($3_customer$ IS NULL OR open_item.customer_id = $3_customer$) 
+0

邏輯上'A而不是B或B'相當於'A或B'。但優化器可能會使用額外的信息和短路。 – shawnt00

+0

@ shawnt00對!感謝您的注意。調整。 – Ruslan

+0

這沒有奏效。我能夠讓所有客戶列出的唯一方法是完全消除WHERE語句中對customer_id的任何引用,然後選擇所有客戶。 –

2

的另一種方法是:

open_item.customer_id = coalesce($3_customer$, open_item.customer_ID) 

假設$ 3_customer $將是NULL

所以$ 3_customer $不能爲空,因此再使用

open_item.customer_id = case when $3_customer$ = '' 
          then open_item.customer_ID else $3_customer$ 

COALESCE需要的情況下,本質上,系列中的第一個非空值將在customer參數爲null時始終返回TRUE。它這樣做是因爲它比較相同的值,因此總是相等的。否則這將過濾特定的$ 3_customer $提​​供

+0

除非''customer_id'由於某種原因可以爲空並且相等性測試失敗。似乎並不適用於這種情況。 – shawnt00

+0

同意。如果NULL對customer_Id具有特殊含義,那麼這將不是一個合適的解決方案。 – xQbert

+0

這沒有奏效。我能夠讓所有客戶列出的唯一方法是完全消除WHERE語句中對customer_id的任何引用,然後選擇所有客戶。 –