Как я могу проверить, не больше ли одного столбца для каждой записи? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть таблица, которая содержит 4 поля ethn_1, ethn_2, ethn_3 и ethn_4.

Мне нужно использовать эти четыре поля, чтобы:

  1. Установить для переменной v_ethn_code этническую принадлежность, которая хранится, когда только одно из этих полей содержит значение.
  2. Установить переменную v_ethn_codeв значение «Неизвестно», если в нескольких столбцах содержится значение.

Пример данных: https://imgur.com/a/El5TRWB

CREATE TABLE users
( id number(4) NOT NULL,
  ethn_1 varchar2(3),
  ethn_2 varchar2(3),
  ethn_3 varchar2(3),
  ethn_4 varchar2(3),
);

INSERT INTO users (id, ethn_1, ethn_2, ethn_3, ethn_4) VALUES (1,'AS',NULL,NULL,NULL);
INSERT INTO users (id, ethn_1, ethn_2, ethn_3, ethn_4) VALUES (2,NULL,NULL,'WH',NULL);
INSERT INTO users (id, ethn_1, ethn_2, ethn_3, ethn_4) VALUES (3,NULL,'BL',NULL,NULL);
INSERT INTO users (id, ethn_1, ethn_2, ethn_3, ethn_4) VALUES (4,'AS','BL',NULL,NULL);
INSERT INTO users (id, ethn_1, ethn_2, ethn_3, ethn_4) VALUES (5,NULL,NULL,NULL,'HO');
INSERT INTO users (id, ethn_1, ethn_2, ethn_3, ethn_4) VALUES (6,NULL,NULL,'WH','HO');
INSERT INTO users (id, ethn_1, ethn_2, ethn_3, ethn_4) VALUES (7,NULL,'BL',NULL,NULL);


╔════╤════════╤════════╤════════╤════════╗
║ id │ ethn_1 │ ethn_2 │ ethn_3 │ ethn_4 ║
╠════╪════════╪════════╪════════╪════════╣
║ 1  │ AS     │        │        │        ║
╟────┼────────┼────────┼────────┼────────╢
║ 2  │        │        │ WH     │        ║
╟────┼────────┼────────┼────────┼────────╢
║ 3  │        │ BL     │        │        ║
╟────┼────────┼────────┼────────┼────────╢
║ 4  │ AS     │ BL     │        │        ║
╟────┼────────┼────────┼────────┼────────╢
║ 5  │        │        │        │ HO     ║
╟────┼────────┼────────┼────────┼────────╢
║ 6  │        │        │ WH     │ HO     ║
╟────┼────────┼────────┼────────┼────────╢
║ 7  │        │ BL     │        │        ║
╚════╧════════╧════════╧════════╧════════╝

Я пытался вложить условные выражения, чтобы определить, является ли ethn_1не NULL, установите его на это, затем проверьте, не является ли ethn_2 не NULL, вернитесь и установите переменную в значение unknown и т. д. ..., но это не будет работать логически, и будет гораздо больше кода, чем я считаю эффективным.Как правильно это проверить?

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Попробуйте что-то вроде этого:

select id, case when nulls=3 then coalesce(ethn_1, ethn_2, ethn_3, ethn_4) else 'Unknown' end variablevalue from (
select a.*, b.nulls from users a join (
select id, case when ethn_1 is null then 1 else 0 end+  
case when ethn_2 is null then 1 else 0 end +
case when ethn_3 is null then 1 else 0 end +
case when ethn_4 is null then 1 else 0 end nulls
from users
group by id, ethn_1, ethn_2, ethn_3, ethn_4) b on a.id=b.id)a
0 голосов
/ 16 мая 2018

Попробуйте это -

http://sqlfiddle.com/#!4/817c0f/2/0

CREATE TABLE ETHN
    (ID INT, ETHN_1 VARCHAR2(6), ETHN_2 VARCHAR2(6), ETHN_3 VARCHAR2(6), ETHN_4 VARCHAR2(6))
;

INSERT ALL 
    INTO ETHN (ID, ETHN_1, ETHN_2, ETHN_3, ETHN_4)
         VALUES (1, 'AS', NULL, NULL, NULL)
    INTO ETHN (ID, ETHN_1, ETHN_2, ETHN_3, ETHN_4)
         VALUES (2, NULL, NULL, 'WH', NULL)
    INTO ETHN (ID, ETHN_1, ETHN_2, ETHN_3, ETHN_4)
         VALUES (3, NULL, 'BL', NULL, NULL)
    INTO ETHN (ID, ETHN_1, ETHN_2, ETHN_3, ETHN_4)
         VALUES (4, 'AS', 'BL', NULL, NULL)
    INTO ETHN (ID, ETHN_1, ETHN_2, ETHN_3, ETHN_4)
         VALUES (5, NULL, NULL, NULL, 'BO')
SELECT * FROM DUAL
;

Запрос -

SELECT STR, CASE WHEN CNT = 3 THEN RESULT ELSE 'UNKNOWN' END AS V_ETHN_CODE FROM (
SELECT STR, REGEXP_REPLACE(STR, ',*NA,*','') AS RESULT, REGEXP_COUNT(STR,'NA') AS CNT FROM (
SELECT NVL(ETHN_1,'NA') ||',' || NVL(ETHN_2,'NA') ||',' || NVL(ETHN_3,'NA') ||',' || NVL(ETHN_4,'NA') AS STR
FROM ETHN
  ));

Вывод

STR             V_ETHN_CODE
AS,NA,NA,NA     AS
NA,NA,WH,NA     WH
NA,BL,NA,NA     BL
AS,BL,NA,NA     UNKNOWN
NA,NA,NA,BO     BO
0 голосов
/ 16 мая 2018

Не самый красивый, но вы можете использовать регистр, чтобы найти число нулей, если оно не равно нулю, когда 1, а затем объединить для отображения единственного значения, иначе неизвестного.

With CTE (Ethn_1, Ethn_2, Ethn_3, Ethn_4) as (
Select 'AS', Null,null,null from dual union all
select null,null,'WH',null from dual union all
select null,'BL',null,null from dual union all
select 'AS','BL',NULL,null from dual union all
select null,null,null,'HO' from dual union all
select null,null,'WH','HO' from dual union all
select null,'BL',null,'HO' from dual)

Select A.*, Case when (Case when Ethn_1 is not null then 1 else 0 end +
                       Case when Ethn_2 is not null then 1 else 0 end+
                       Case when Ethn_3 is not null then 1 else 0 end+
                       Case when Ethn_4 is not null then 1 else 0 end) = 1 
                 then coalesce(Ethn_1, Ethn_2, Ethn_3, Ethn_4) 
                 else 'UNKNOWN' end AS v_ethn_code 
from cte A;

или чек равен нулю и считается 3

Select A.*, Case when (case when Ethn_1 is null then 1 else 0 end+
                       Case when Ethn_2 is null then 1 else 0 end+
                       Case when Ethn_3 is null then 1 else 0 end+
                       Case when Ethn_4 is null then 1 else 0 end) = 3
                 then coalesce(Ethn_1, Ethn_2, Ethn_3, Ethn_4) 
                 else 'UNKNOWN' end AS v_ethn_code
from cte A;

Я не могу найти функцию, которая приводит к 1,0 для нулевой проверки, которая позволит избежать операторов case.

В результате:

+--------+--------+--------+--------+-------------+
| ETHN_1 | ETHN_2 | ETHN_3 | ETHN_4 | V_ETHN_CODE |
+--------+--------+--------+--------+-------------+
| AS     |        |        |        | AS          |
|        |        | WH     |        | WH          |
|        | BL     |        |        | BL          |
| AS     | BL     |        |        | UNKNOWN     |
|        |        |        | HO     | HO          |
|        |        | WH     | HO     | UNKNOWN     |
|        | BL     |        | HO     | UNKNOWN     |
+--------+--------+--------+--------+-------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...