【问题标题】:Selecting superset and subsets from table从表中选择超集和子集
【发布时间】: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。完成

标签: sql oracle


【解决方案1】:
...
where (col_1 = :val_1 or :val_1 is null)
  and (col_2 = :val_2 or :val_2 is null)
  and (col_3 = :val_3 or :val_3 is null)
  [and ... other conditions]
...

您也可以使用 nvl 或 who-knows-what 来操纵它,但正确处理会很痛苦(很容易出错),而且将来其他人阅读代码也会很痛苦.我写它的方式你不会弄错,而且很容易阅读和理解。

【讨论】:

    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多