如果满足条件,我试图从具有很多行的表中返回单个值。 例如,我有一个表(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'
。
答案 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'