Plsql 运算符%不适用于空值

Plsql 运算符%不适用于空值,plsql,null,operator-keyword,Plsql,Null,Operator Keyword,假设customer表如下所示 cust_id | name | address | language A | AAA | ZZZZ | en B | BBB | YYYY | C | CCC | XXXX | pl D | DDD | WWWW | en 我想得到一个plsql代码,它将接受用户对语言字段的输入,并且当用户

假设customer表如下所示

cust_id  |  name  |   address | language
A        |   AAA  |      ZZZZ |      en
B        |   BBB  |      YYYY |      
C        |   CCC  |      XXXX |      pl
D        |   DDD  |      WWWW |      en
我想得到一个plsql代码,它将接受用户对语言字段的输入,并且当用户输入时

1. 'en'; cust_id: A,B should be the result
2. 'pl'; cust_id: C should be the result
3. doesnt input a value;  cust_id: A,B,C,D should be the result

select cust_id from customer c where c.language like NVL('&lang','%');

选项1和2可以很好地处理上述查询,但3不会产生任何值。我认为这是因为%运算符不使用空值。有人能帮我修改能够给出所有3个选项结果的查询吗?

您只需使用解码,如下例所示:

select *
from (select 'en' col1 from dual union all
      select 'en' from dual union all
      select 'pl' from dual union all
      select null from dual) dummy
where decode('&lang', col1, 1, -- If lang is not null and equals col1, return 1, this will only select raws where lang = col1
                      null, 1,    -- if lang is null return 1, this will select every raw
                            2)  = 1 -- Default equals 2 for everything not fitting col1, will only be used if lang is not null
O/p lang=en:

en
en
pl
O/p lang=en:

en
en
pl
O/p lang为空:

en
en
pl
"null"
您的选择应该如上面示例中所示:

select cust_id 
from customer c 
where decode('&lang', col1, 1, 
                      null, 1, 
                            2)  = 1; 

您只需使用
即可:

with customer (cust_id, name, address, language) as
     ( select 'A', 'AAA', 'ZZZZ', 'en' from dual union all
       select 'B', 'BBB', 'YYYY', null from dual union all
       select 'C', 'CCC', 'XXXX', 'pl' from dual union all
       select 'D', 'DDD', 'WWWW', 'en' from dual )
select * from customer c
where  (c.language = '&lang' or '&lang' is null);

您可以使用以下查询:

select cust_id from customer c where c.language = NVL('&lang', c.language);

&lang
null
时,查询将返回
customer
表中的所有行

%
类似的
操作符一起工作,这里您只需比较
a==%?
。这行不通。如果
&A
为空,您只需将其与
c.language
进行比较即可。我已使用“like”编辑了查询。但它仍然没有给我第三个问题的预期输出。你得到了更多的结果吗?理论上你应该得到
A
C
D
B
不会显示为
null
与任何值都不一样,需要单独的
null
检查,或者另一个单独的
nvl
检查
&lang
语言
是否为null。实际上,我需要的是,如果用户没有输入任何内容,所有记录都应该被提取,如果用户专门输入值,则查询应给出该输入的预期结果。你知道怎么做吗?我这里没看到。这看起来像一个简单的SQL问题。