Как вернуть только одну запись, если все столбцы возвращают нулевые или только ненулевые столбцы - PullRequest
0 голосов
/ 15 мая 2019

Мне нужен способ справиться со следующим сценарием.

Напишите запрос для преобразования следующего набора результатов

ID|Location|NameA|ValueA|NameB|ValueB
__|________|_____|______|_____|______|
0 |   BL   |NULL |NULL  |NULL |NULL  |
__|________|_____|______|_____|______|
1 |   GT   |x    |y     |NULL |NULL  |
__|________|_____|______|_____|______|
2 |   SZ   |c    |d     |e    |f     |

... к этому

ID|Location|Name |Value |
__|________|_____|______|
0 |   BL   |NULL |NULL  |
__|________|_____|______|
1 |   GT   |x    |y     |
__|________|_____|______|
2 |   SZ   |c    |d     |
 _|________|_____|______|
2 |   SZ   |e    |f     |

Для записей со всеми NULL столбцами «Имя / Значение» Мне не нужны две записи в результирующей таблице, я хочу только одну, и для записей с более чем одним NON-NULL именем Пары / значение Я хочу, чтобы они отображались в виде отдельных записей результирующей таблицы, а NULL-пары имя / значение игнорируются.

Ответы [ 4 ]

1 голос
/ 15 мая 2019

Это относится к случаю, когда nameA и valueA равны нулю, а nameB и valueB не равны нулю:

select id, location, namea name, valuea value
from tablename
where namea is not null or valuea is not null
union all
select id, location, nameb, valueb
from tablename
where nameb is not null or valueb is not null
union all
select id, location, null, null
from tablename
where namea is null and valuea is null and nameb is null and valueb is null
order by id

См. Демонстрационную версию .

1 голос
/ 15 мая 2019

В Oracle 12C вы можете использовать для этого боковое соединение.В более ранних версиях, вероятно, самый простой метод - union all:

select id, location, nameA as name, valueA as value
from t
union all
select id, location, nameB as name, valueB as value
from t
where nameB is not null;
0 голосов
/ 15 мая 2019

Другим способом сделать это является использование UNPIVOT:

-- Sample Data:
WITH dat(ID,Location,NameA,ValueA,NameB,ValueB) AS
  (SELECT 0 ,   'BL'   ,NULL ,NULL  ,NULL ,NULL  FROM dual
    UNION
   SELECT 1 ,   'GT'   ,'x'  ,'y'   ,NULL ,NULL  FROM dual
    UNION
   SELECT 2 ,   'SZ'   ,'c'  ,'d'   ,'e'  ,'f'   FROM dual)

-- SQL-Statement:
SELECT id,location, NAME, value 
  FROM dat
  UNPIVOT INCLUDE NULLS(
    (NAME, VALUE) FOR sk IN ((NameA, ValueA) AS 1
                            ,(NameB, ValueB) AS 2)
  )
  WHERE SK = 1 OR NAME IS NOT NULL
0 голосов
/ 15 мая 2019
SELECT
    id,
    location,
    COALESCE(nameA,  nameB )   AS name,
    COALESCE(valueA, valueB)   AS value
FROM
    yourtable

UNION ALL

SELECT
    id,
    location,
    nameB,
    valueB
FROM
    yourTable
WHERE
        nameA IS NOT NULL
    AND nameB IS NOT NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...