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

SQL-根据一个特定的输入值选择数据,如果没有输入值,则选择全部,sql,Sql,我试图使用一个输入变量(客户代码)检索数据。如果用户输入客户代码,查询将检索该客户数据,但如果用户将客户代码留空,则我希望检索所有客户数据。下面是我可以根据“3_customer”中输入的客户代码检索数据的代码,但我不知道如何执行这种IF-THEN-ELSE类型的查询。如果输入变量留空,我需要获取所有客户的数据 谢谢, 堂 选择 打开项目。订单号订单号, 转换(varchar(10),订单。订单日期,101)订单日期, orders.revenue\u代码\u id, orders.operat

我试图使用一个输入变量(客户代码)检索数据。如果用户输入客户代码,查询将检索该客户数据,但如果用户将客户代码留空,则我希望检索所有客户数据。下面是我可以根据“3_customer”中输入的客户代码检索数据的代码,但我不知道如何执行这种IF-THEN-ELSE类型的查询。如果输入变量留空,我需要获取所有客户的数据

谢谢, 堂

选择
打开项目。订单号订单号,
转换(varchar(10),订单。订单日期,101)订单日期,
orders.revenue\u代码\u id,
orders.operations\u用户,
未结项目。客户id客户编号,
customer.name客户名称,
转换(varchar(10),未结项。总账日期,101)调整日期,
未清项金额,
打开项。记录类型,
打开\u item.ar\u原因\u代码\u id,
应收账款原因代码。说明原因
从…起
未清项
左外连接
customer.id上的客户=未结项目.customer\u id
左外连接
未结项目上的应收账款原因代码。应收账款原因代码id=应收账款原因代码id
左外连接
orders ON orders.id=未结项目.order\u id
哪里
open_item.gl_date>=$1_sdate$和

open_item.gl_date您需要稍微更改客户条件的
WHERE
条款:

and open_item.customer_id = $3_customer$
类似这样的情况:(下面的代码假设
$3\u customer$
正在插入查询字符串,如果为空,则将设置为
NULL


您需要稍微更改客户条件的
WHERE
子句,如下所示:

and open_item.customer_id = $3_customer$
类似这样的情况:(下面的代码假设
$3\u customer$
正在插入查询字符串,如果为空,则将设置为
NULL


另一种方法是:

open_item.customer_id = coalesce($3_customer$, open_item.customer_ID)
假设$3_customer$为空

因此$3_customer$不能为空,因此请使用case

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

coalesce接受序列中的第一个非null值,本质上,当customer参数为null时,它将始终返回TRUE。它这样做是因为它比较相同的值,因此总是相等的;否则,这将过滤提供的特定$3_客户$

open_item.customer_id = coalesce($3_customer$, open_item.customer_ID)
假设$3_customer$为空

因此$3_customer$不能为空,因此请使用case

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


coalesce接受序列中的第一个非null值,本质上,当customer参数为null时,它将始终返回TRUE。它这样做是因为它比较相同的值,因此总是相等的;否则,这将筛选提供的特定$3_customer$

这是什么数据库?@Ruslan:看起来像SQL Server所以customer_ID可以是“空白”/“空集”而不是NULL?或者customer.ID中可能有非显示字符?@xQbert:customer.ID的输入字段中似乎没有任何非显示字符。表中的customer_id字段不能为空。因此,是否在$3_customer$上传入了空集“”?我在期待NULL这是什么数据库?@Ruslan:看起来像SQL Server那么customer_ID可以是“空白”/“空集”而不是NULL?或者customer.ID中可能有非显示字符?@xQbert:customer.ID的输入字段中似乎没有任何非显示字符。表中的customer_id字段不能为空。因此,是否在$3_customer$上传入了空集“”?我希望
A而不是B或B
等同于
A或B
。但优化器可能会使用额外的信息和短路。@shawnt00对!谢谢你的注意。调整好了,这不起作用。我能够让所有客户列出的唯一方法是完全消除WHERE语句中对客户id的任何引用,然后它选择所有客户。逻辑上
A而不是B或B
相当于
A或B
。但优化器可能会使用额外的信息和短路。@shawnt00对!谢谢你的注意。调整好了,这不起作用。我能够让所有客户列出的唯一方法是在WHERE语句中完全消除对客户id的任何引用,然后它选择所有客户。除非
customer\u id
由于某种原因可以为空,并且相等性测试失败。但在这种情况下似乎不适用。同意。如果NULL对customer_Id有特殊意义,那么这将不是一个合适的解决方案。这不起作用。我能够让所有客户列出的唯一方法是在WHERE语句中完全消除对客户id的任何引用,然后它选择所有客户。除非
customer\u id
由于某种原因可以为空,并且相等性测试失败。但在这种情况下似乎不适用。同意。如果NULL对customer_Id有特殊意义,那么这将不是一个合适的解决方案。这不起作用。我能够让所有客户列出的唯一方法是,在WHERE语句中完全消除对customer_id的任何引用,然后它选择所有客户。