Скрыть столбцы, если все значения равны нулю или нулю

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


50
2

Ответы:

Вы не можете сделать это с помощью 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;