我想知道SQL(特别是Oracle SQL)中是否有一种方法可以识别以下内容:
我有10列,称它们为A,B,...,J。这些列中的每一列都是Y / N字段。我希望能够确定给定行是否至少有两列是“Y”。我在声明时会做一个案例,但我不知道是否有一种简单的方法可以做到这一点而不会写出每一个排列。
提前致谢。
您可以将Y
映射到1并将N
映射到0,然后对列中的值求和,如果它加起来为2或更多,那么您至少有两列包含Y
。
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 |
case when
很复杂。
我会去regexp_count()
:
select regexp_count(a||b||c||d||e||f||g||h||i||j, 'Y')