我想知道SQL(特别是Oracle SQL)中是否可以识别以下内容:
我有10列,分别称为A,B,...,J。这些列中的每列都是一个Y / N字段。我希望能够为给定的行确定是否至少有两列为“ Y”。我本来打算做一个 case when 语句,但是我不知道是否有一种简单的方法可以在不写出每个排列的情况下做到这一点。
谢谢。
答案 0 :(得分:2)
您可以将Y
映射为1,将N
映射为0,然后将各列中的值求和,如果其总和为2或更多,则至少有两列包含{{1 }}。
Oracle 11g R2架构设置:
Y
查询1 :
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;
Results :
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
函数。
查询2 :
DECODE
Results :
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
答案 1 :(得分:0)
case when
很复杂。
我会去regexp_count()
:
select regexp_count(a||b||c||d||e||f||g||h||i||j, 'Y')