检查表格行值时返回单个值

时间:2019-02-08 22:11:17

标签: sql oracle oracle11g

如果满足条件,我试图从具有很多行的表中返回单个值。 例如,我有一个表(ID(pk),CODE(pk),DESCRIPTION),其中有很多行。如果....

SELECT CASE
    WHEN CODE IN ('1', '2') THEN '100'
    WHEN CODE IN ('2', '3') THEN '200'
    WHEN CODE IN ('5', '7') THEN '300'
END AS ASDASD
FROM TABLE
WHERE ID = 1;

问题在于CODE必须检查两者,而不仅仅是其中之一。例如,如果ID的代码为“ 2”,则按原样返回代码。

ASDASD
NULL
'200'

我只想返回'200',因为该ID具有代码'2''3'

3 个答案:

答案 0 :(得分:1)

您可以尝试使用条件聚合,如下所示:

Else

DECODE()是一个方便的Oracle函数,将表达式(If)与一系列值进行比较并相应地返回结果。基本上,条件SELECT CASE WHEN MAX(DECODE(code, '1', 1)) = 1 AND MAX(DECODE(code, '2', 1)) = 1 THEN '100' WHEN MAX(DECODE(code, '2', 1)) = 1 AND MAX(DECODE(code, '3', 1)) = 1 THEN '200' WHEN MAX(DECODE(code, '5', 1)) = 1 AND MAX(DECODE(code, '7', 1)) = 1 THEN '300' END AS asdasd FROM TABLE WHERE ID = 1; 确保至少一行具有code

PS:您真的将数字存储为字符串吗?如果MAX(DECODE(code, '1', 1)) = 1是数字数据类型,请在上面的查询中删除单引号。

答案 1 :(得分:1)

假设没有为特定的id复制代码:

SELECT ID,
       (CASE WHEN SUM(CASE WHEN CODE IN ('1', '2') THEN 1 ELSE 0 END) = 2
             THEN '100'
             WHEN SUM(CASE WHEN CODE IN ('2', '3') THEN 1 ELSE 0 END) = 2
             THEN '200'
             WHEN SUM(CASE WHEN CODE IN ('5', '7') THEN 1 ELSE 0 END) = 2
             THEN '300'
     END) AS ASDASD
FROM TABLE
WHERE ID = 1
GROUP BY ID;

我将ID添加到了SELECT,只是因为这可能对多个ID有用。

答案 2 :(得分:1)

您需要检查查询返回的数字,如下所示:

SELECT COUNT(DISTINCT CODE) FROM TABLE WHERE ID = 1 AND CODE IN ('1', '2')

如果此数字为2,则ID = 1的{​​{1}}值分别为CODE'1'

'2'