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

时间:2018-09-04 19:02:18

标签: sql oracle permutation

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

我有10列,分别称为A,B,...,J。这些列中的每列都是一个Y / N字段。我希望能够为给定的行确定是否至少有两列为“ Y”。我本来打算做一个 case when 语句,但是我不知道是否有一种简单的方法可以在不写出每个排列的情况下做到这一点。

谢谢。

2 个答案:

答案 0 :(得分:2)

您可以将Y映射为1,将N映射为0,然后将各列中的值求和,如果其总和为2或更多,则至少有两列包含{{1 }}。

SQL Fiddle

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