Вы можете использовать:
SELECT *
FROM table_name
WHERE CASE WHEN col1 IS NULL THEN 1 ELSE 0 END
+ CASE WHEN col2 IS NULL THEN 1 ELSE 0 END
+ CASE WHEN col3 IS NULL THEN 1 ELSE 0 END
+ CASE WHEN col4 IS NULL THEN 1 ELSE 0 END
> 0;
или просто:
SELECT *
FROM table_name
WHERE ( col1 IS NULL OR col2 IS NULL OR col3 IS NULL OR col4 IS NULL );
Или если вы хотите исключить строки, которые целиком NULL
s, то:
SELECT *
FROM table_name
WHERE CASE WHEN col1 IS NULL THEN 1 ELSE 0 END
+ CASE WHEN col2 IS NULL THEN 1 ELSE 0 END
+ CASE WHEN col3 IS NULL THEN 1 ELSE 0 END
+ CASE WHEN col4 IS NULL THEN 1 ELSE 0 END
BETWEEN 1 AND 3;
или
SELECT *
FROM table_name
WHERE ( col1 IS NULL OR col2 IS NULL OR col3 IS NULL OR col4 IS NULL )
AND NOT ( col1 IS NULL AND col2 IS NULL AND col3 IS NULL AND col4 IS NULL );
Если вы создаете индекс по четырем столбцам:
CREATE INDEX table_name__idx ON table_name ( col1, col2, col3, col4 );
Тогда нижний запрос может быть выполнен как INDEX FULL SCAN
, как показано в объясненииplan:
| PLAN_TABLE_OUTPUT |
| :----------------------------------------------------------------------------------------- |
| Plan hash value: 1211442363 |
| |
| ------------------------------------------------------------------------------------ |
| | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | |
| ------------------------------------------------------------------------------------ |
| | 0 | SELECT STATEMENT | | 6 | 60 | 1 (0)| 00:00:01 | |
| |* 1 | INDEX FULL SCAN | TABLE_NAME__IDX | 6 | 60 | 1 (0)| 00:00:01 | |
| ------------------------------------------------------------------------------------ |
db <> fiddle здесь
Использование функций (таких как CASE
или GREATEST
) не позволит Oracle использовать индекс.