首页 > 解决方案 > SQL确定N列中的2列是否具有特定值

问题描述

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

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

提前致谢。

标签: sqloraclepermutation

解决方案


您可以将 映射Y到 1 和N0,然后对各列的值求和,如果它加起来为 2 或更多,那么您至少有两列包含Y.

SQL小提琴

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 |

推荐阅读