仅过滤列 "if" 满足特定条件

Filtering columns only "if" certain condition is satisfied

我table如下

我想要如下输出

我试过如下操作

SELECT * FROM TABLE_NAME WHERE COLUMN2 = 'PQR' AND COLUMN3 IS NOT NULL

但它也会从第一个 table 中删除 3rd and 4th row。而在查询的输出中,我只需要删除具有 Column2 as PQR and Column3 as NOT NULL

的行

我也尝试过使用 case 语句,但我无法真正了解如何实现它。

编辑 1:-

我现在还想再尝试一件事。

SELECT * FROM TABLE_NAME WHERE COLUMN2 IN ('PQR', 'XYZ', 'RST') AND COLUMN3 IS NOT NULL

但问题实际上是 table COLUMN2 有超过 150 个不同的值,我不能在 IN 子句中继续提及。

你要的是(如果我没理解错的话)

NOT (COLUMN2 = 'PQR' AND COLUMN3 IS NOT NULL) 

相当于

COLUMN2!='PQR' OR COLUMN3 IS NULL
  1. 不是(第 2 列 = 'PQR' 并且第 3 列不为空)

示例:

SQL> ;
  1  with -- test data:
  2   t(column1,column2,column3) as (
  3     select 'ABC','PQR',cast(null as int) from dual union all
  4     select 'DEF','PQR',123 from dual union all
  5     select 'GHI','XYZ',cast(null as int) from dual union all
  6     select 'JKL','RST',cast(null as int) from dual
  7  ) -- test query:
  8  select *
  9  from t
 10* where not(COLUMN2 = 'PQR' AND COLUMN3 IS NOT NULL)
SQL> /

COL COL    COLUMN3
--- --- ----------
ABC PQR NULL
GHI XYZ NULL
JKL RST NULL

或 lnnvl(COLUMN2 = 'PQR') 或 COLUMN3 为 NULL

示例:

with -- test data:
 t(column1,column2,column3) as (
   select 'ABC','PQR',cast(null as int) from dual union all
   select 'DEF','PQR',123 from dual union all
   select 'GHI','XYZ',cast(null as int) from dual union all
   select 'JKL','RST',cast(null as int) from dual 
) -- test query:
select * 
from t
where lnnvl(COLUMN2 = 'PQR') or COLUMN3 IS NULL;

COL COL    COLUMN3
--- --- ----------
ABC PQR NULL
GHI XYZ NULL
JKL RST NULL