SQL - получить только столбцы из таблицы, где не все значения равны нулю - PullRequest
0 голосов
/ 20 сентября 2018

Вопрос SQL: Как получить все значения столбцов из столбцов, где не все значения являются нулевыми?

Таблица A

COL1    COL2    COL3    COL4    COL5
---------------------------------------
abc     1       NULL    NULL    NULL
def     2       NULL    testA   NULL
NULL    3       NULL    testB   NULL
jkl     4       NULL    NULL    NULL

Я хочу получить

COL1    COL2    COL4    
-----------------------
abc     1       NULL    
def     2       testA   
NULL    3       testB   
jkl     4       NULL    

Есть ли решение sql или plsql для достижения этой цели?Чтобы избежать ответов, которые не имеют значения: предположим, у меня есть миллион строк.Я хочу, чтобы результат был представлением или таблицей результатов.Не письменный вывод.

Я нашел похожий вопрос, но он не удовлетворяет мою потребность: Как выбрать столбцы из таблицы, которые имеют ненулевые значения?

Имена столбцов могут быть быстро получены с помощью этого запроса

select column_name 
from all_tab_columns 
where lower(table_name)='tableA' and num_distinct > 0;

Я понимаю, что мог бы создать скрипт с курсором, а затем перебрать его, добавив результат в новую таблицу или представление.Это не то, что мне нужно.Я задавался вопросом, можно ли это сделать, используя один запрос, используя pivot / unpivot или что-то еще.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

попробуйте эти шаги, это может помочь:

Create table temp as (Select * from TableA)

Declare NbrRows Number(10);
plsql_block VARCHAR2(1000);
CountNullRows Number (10)

Select count(*) as nbr 
into NbrRows
from TableA

Select count(COL1) as nbr
into CountNullRows
from TableA where COL1 is null

if (NbrRows = CountNullRows) then
Alter table Temp drop column COL1
endif

Select count(COL2) as nbr
into CountNullRows
from TableA where COL2 is null

if (NbrRows = CountNullRows) then
Alter table Temp drop column COL2
endif

Select count(COL3) as nbr
into CountNullRows
from TableA where COL3 is null

if (NbrRows = CountNullRows) then
Alter table Temp drop column COL3
endif

...etc...

Сделайте то же самое для всех ваших столбцов

У вас есть желаемый результат в таблице Tem.

0 голосов
/ 20 сентября 2018

То, что вы просите, невозможно в простом SQL, если вы заранее не знаете, какие столбцы везде имеют NULL.(Похоже, вы не хотите предполагать, что знаете это.)

Какие столбцы включены в выходные данные - сколько столбцов, их имена и в каком порядке они появляются - должны быть жестко закодированыв предложении SELECT его нельзя определить во время выполнения.С другой стороны, вы будете знать, какие столбцы имеют значение NULL, только после чтения данных (то есть во время выполнения), иначе вы должны получить эту информацию из внешнего источника.

Единственный способ сделать этото, что вы хотите сделать, это динамический SQL .Это сложная тема, и этот метод обычно считается плохой практикой ведения бизнеса.

ПОЧЕМУ вы не хотите показывать столбцы со значениями все-НУЛЬ?Вы уверены, что это требование имеет смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...