SQL - 根据一个特定输入值选择数据,如果没有输入值,则选择所有数据

时间:2015-12-15 21:31:29

标签: sql

我正在尝试使用输入变量检索数据,该输入变量是客户代码。如果用户输入客户代码,查询将检索该客户数据,但如果用户将客户代码留空,我想检索所有客户数据。下面是我可以根据'3_customer'中的客户代码输入检索数据的代码,但我无法弄清楚如何执行此IF-THEN-ELSE类型的查询我需要为所有客户获取数据(如果输入变量)留空。

谢谢, 唐

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 个答案:

答案 0 :(得分: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获取系列中的第一个非null值本质上,当customer参数为null时,它总是返回TRUE。它这样做是因为它比较了相同的值,因此总是相等;否则,这将过滤特定的$ 3_customer $提​​供的

答案 1 :(得分:1)

您需要稍微更改客户条件的WHERE子句:

and open_item.customer_id = $3_customer$

这样的事情:(以下代码假设$3_customer$已插入查询字符串,如果为空则将设置为NULL

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