Цель, которую я пытаюсь достичь, — скрыть столбец, если все его значения имеют значение 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.
Если вы хотите скрыть столбцы, это следует сделать на языке программирования, с которого вы вызываете базу данных (например, 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;
Чтобы полностью скрыть весь столбец из набора результатов, потребуется использовать динамический SQL... это невозможно сделать, просто используя синтаксис запроса. Обычно это то, что вы обрабатываете на уровне представления.