【发布时间】:2022-01-20 14:34:51
【问题描述】:
在尝试发明从表中选择某些数据的方法时,我一头雾水。沙盒表如下所示:
|COL_1|COL_2|COL_3|
|-----|-----|-----|
| | | |
| | 2 | |
|1 | | |
|4 | 3 | |
|8 | | 7 |
| | 4 | 5 |
|1 | 6 | 3 |
创建它的代码如下:
create table tmp_224391 as (select 1 as col_1, 2 as Col_2, 3 as Col_3 from dual);
truncate table tmp_224391;
INSERT INTO tmp_224391 VALUES(NULL,NULL,NULL);
INSERT INTO tmp_224391 VALUES(NULL,2,NULL);
INSERT INTO tmp_224391 VALUES(1,NULL,NULL);
INSERT INTO tmp_224391 VALUES(4,3,NULL);
INSERT INTO tmp_224391 VALUES(8,NULL,7);
INSERT INTO tmp_224391 VALUES(NULL,4,5);
INSERT INTO tmp_224391 VALUES(1,6,3);
commit;
我要做的是编写一个查询来根据三个变量(:val_1、:val_2 和 :val_3)的值选择所有行或某些行,每个变量代表柱子。所以假设的代码看起来有点像这样:
select * from tmp_224391
where 1=1
and nvl(col_1,0) = nvl(:val_1,0)
...
诀窍是,如果:val_1 = 1,我只需要 COL_1 中包含 1 的行(或者如果 :val_1 = 4,我只需要 COL_1 中包含 4 的行。但如果 :val_1 为空- 无论:val_1 中有什么,我都需要所有行。
例如:
- IF
:val_1 is null、:val_2 is null和:val_3 is null- 我需要获取整个表格 - IF
:val_1 = 1、:val_2 is null和:val_3 is null- 我需要获取行
示例:
|1 | | |
|1 | 6 | 3 |
这样的选择怎么写?
【问题讨论】:
-
这里有问题吗?如果是,请提供更多细节和预期结果
-
@ChrᴉzremembersMonica,抱歉,刚刚完善了帖子。
-
@Pugzly,抱歉刚刚通过添加详细信息和预期结果完成了帖子。谢谢。
-
我认为您遗漏了一些需要澄清的案例。如果你的意思是“当 :val_x 为 NULL 时,这匹配任何 col_x,甚至为 null”,你应该清楚地表明这一点。
-
问题是什么? 如果 :val_1 = 1,我只需要 COL_1 中包含 1 的行 -
col1 =:val_1 and :val_1 is not null。 但如果 :val_1 为空 -or :val_1 is null and ...我需要所有行,无论 :val_1 中有什么 -... and 1 = 1。然后一起:(col1 =:val_1 and :val_1 is not null) or (:val_1 is null and 1 = 1)。记住 null 不等于任何东西,删除不必要的条件:col1 =:val_1 or :val_1 is null。完成