SQL确定N列中的2列是否具有特定值

问题描述 投票:0回答:2

我想知道SQL(特别是Oracle SQL)中是否有一种方法可以识别以下内容:

我有10列,称它们为A,B,...,J。这些列中的每一列都是Y / N字段。我希望能够确定给定行是否至少有两列是“Y”。我在声明时会做一个案例,但我不知道是否有一种简单的方法可以做到这一点而不会写出每一个排列。

提前致谢。

sql oracle permutation
2个回答
2
投票

您可以将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

Results

| 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

Results

| 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 |

0
投票

case when很复杂。

我会去regexp_count()

select regexp_count(a||b||c||d||e||f||g||h||i||j, 'Y')
© www.soinside.com 2019 - 2024. All rights reserved.