SQL Определите, имеют ли 2 из N столбцов определенное значение - PullRequest
0 голосов
/ 04 сентября 2018

Я хочу знать, есть ли способ в SQL (в частности, Oracle SQL) идентифицировать следующее:

У меня есть 10 столбцов, назовите их A, B, ..., J. Каждый из этих столбцов является полем Y / N. Я хочу иметь возможность определить для данной строки, если по крайней мере два из столбцов "Y". Я собирался сделать случай, когда оператор, но я не знаю, есть ли простой способ сделать это без выписывания каждой отдельной перестановки.

Заранее спасибо.

Ответы [ 2 ]

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

A case when сложно.

Я бы пошел на regexp_count():

select regexp_count(a||b||c||d||e||f||g||h||i||j, 'Y')
0 голосов
/ 04 сентября 2018

Вы можете сопоставить Y с 1 и N с 0, а затем суммировать значения по столбцам, и если оно складывается до 2 или более, у вас есть по крайней мере два столбца, содержащие Y.

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE table_name ( A, B, C, D, E, F, G, H, I, J ) AS
SELECT 'Y', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N' FROM DUAL UNION ALL
SELECT 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N' FROM DUAL UNION ALL
SELECT 'N', 'Y', 'N', 'Y', 'N', 'N', 'N', 'N', 'N', 'N' FROM DUAL UNION ALL
SELECT 'N', 'N', 'Y', 'N', 'N', 'N', 'Y', 'N', 'Y', 'N' FROM DUAL;

Запрос 1 :

SELECT *
FROM   table_name
WHERE  DECODE( A, 'Y', 1, 0 )
     + DECODE( B, 'Y', 1, 0 )
     + DECODE( C, 'Y', 1, 0 )
     + DECODE( D, 'Y', 1, 0 )
     + DECODE( E, 'Y', 1, 0 )
     + DECODE( F, 'Y', 1, 0 )
     + DECODE( G, 'Y', 1, 0 )
     + DECODE( H, 'Y', 1, 0 )
     + DECODE( I, 'Y', 1, 0 )
     + DECODE( J, 'Y', 1, 0 ) >= 2

Результаты

| A | B | C | D | E | F | G | H | I | J |
|---|---|---|---|---|---|---|---|---|---|
| N | Y | N | Y | N | N | N | N | N | N |
| N | N | Y | N | N | N | Y | N | Y | N |

Вы также можете использовать CASE a WHEN 'Y' THEN 1 ELSE 0 END вместо функции DECODE.

Запрос 2 :

SELECT *
FROM   table_name
WHERE  CASE A WHEN 'Y' THEN 1 ELSE 0 END
     + CASE B WHEN 'Y' THEN 1 ELSE 0 END
     + CASE C WHEN 'Y' THEN 1 ELSE 0 END
     + CASE D WHEN 'Y' THEN 1 ELSE 0 END
     + CASE E WHEN 'Y' THEN 1 ELSE 0 END
     + CASE F WHEN 'Y' THEN 1 ELSE 0 END
     + CASE G WHEN 'Y' THEN 1 ELSE 0 END
     + CASE H WHEN 'Y' THEN 1 ELSE 0 END
     + CASE I WHEN 'Y' THEN 1 ELSE 0 END
     + CASE J WHEN 'Y' THEN 1 ELSE 0 END >= 2

Результаты :

| A | B | C | D | E | F | G | H | I | J |
|---|---|---|---|---|---|---|---|---|---|
| N | Y | N | Y | N | N | N | N | N | N |
| N | N | Y | N | N | N | Y | N | Y | N |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...