Цель, которую я пытаюсь достичь, — скрыть столбец, если все его значения имеют значение null или null.
CREATE TABLE m_value_tbl (net_value, net_con,total_net) AS
SELECT cast(NULL as number), cast(0 as number), cast(NULL as number) FROM DUAL
UNION ALL
SELECT cast(NULL as number), cast(2 as number), cast(NULL as number) FROM DUAL ;
Ожидаемый результат:
net_value net_con total_net
null 2 null
Я попробовал следующее:
SELECT
net_value
,net_con
,TOTAL_NET
from m_value_tbl
where
(net_value IS NOT NULL
OR net_con IS NOT NULL
OR total_net IS NOT NULL)
🤔 А знаете ли вы, что...
SQL позволяет создавать индексы на нескольких столбцах для оптимизации поиска данных.
Вы не можете сделать это с помощью SQL.
Если вы хотите скрыть столбцы, это следует сделать на языке программирования, с которого вы вызываете базу данных (например, Java, PHP, C#, Python и т. д.), например SQL (на любом диалекте, а не только Oracle) и клиентских приложениях. которые передают SQL-запросы в базу данных (SQL*Plus, SQL Developer, TOAD и т. д.), не поддерживают условное отображение столбцов на основе результатов.
Если вы хотите сделать это с помощью PL/SQL, то что-то вроде:
DECLARE
v_cur SYS_REFCURSOR;
v_cnt PLS_INTEGER;
BEGIN
SELECT COUNT(total_net) INTO v_cnt FROM m_value_tbl;
IF v_cnt > 0 THEN
OPEN v_cur FOR
SELECT net_value, net_con, total_net FROM m_value_tbl;
ELSE
OPEN v_cur FOR
SELECT net_value, net_con FROM m_value_tbl;
END IF;
DBMS_SQL.RETURN_RESULT(v_cur);
END;
/
Этот запрос кажется совершенно запутанным. Вы говорите, что хотите исключить из результатов столбцы, все значения которых равны нулю. Но в соответствии с показанным желаемым результатом кажется, что вы хотите исключить из результата все строки, где все значения равны нулю или нулю.
В вашем запросе вы выбираете все строки, в которых хотя бы один из столбцов не равен нулю (используя OR
):
WHERE net_value IS NOT NULL
OR net_con IS NOT NULL
OR total_net IS NOT NULL
Вместо этого вам нужно, чтобы все столбцы соответствовали вашему условию (с помощью AND
), т. е.:
WHERE net_value IS NOT NULL
AND net_con IS NOT NULL
AND total_net IS NOT NULL
Поскольку ваше условие состоит в том, что все столбцы не должны быть ни нулевыми, ни нулевыми, вы можете использовать WHERE .. IS NOT NULL AND .. <> 0
, который можно упростить до WHERE .. <> 0
, поскольку NULL никогда не может быть равным или неравным значению.
SELECT
net_value,
net_con,
total_net
FROM m_value_tbl
WHERE net_value <> 0
AND net_con <> 0
AND total_net <> 0;