解码 Oracle SQL 中的多个值

Multiple values in decode Oracle SQL

我有一个简单的问题,但找不到解决方案。我需要:

WHERE
(tableABC.name = (DECODE (:p_type,'Morning', 'GOODMORNING',
                                  'Afternoon', 'GOODAFTERNOON',
                                  'Day', IN('GOODMORNING','GOODAFTERNOON'))

不幸的是,它不起作用。我不能使用任何其他 table 因为它在报告中使用并且 "Morning, Afternoon, Day" 是想象的词(它应该是用户友好的)。秒确实存在于 table 中,但此列还有许多下一个值(例如:'GOODEVENING'、'GOODNIGHT')。 我只需要 select 来自具有许多不同值的特定列的两个值,这些值将在 "Day" selection.

下 selected

非常感谢, D.

中间不能把比较条件从=改成IN。您可以通过切换到仅使用简单的布尔逻辑来实现您的目标:

WHERE (:p_type = 'Morning' AND tableABC.name = 'GOODMORNING')
   OR (:p_type = 'Afternoon' AND tableABC.name = 'GOODAFTERNOON')
   OR (:p_type = 'Day' AND tableABC.name IN ('GOODMORNING', 'GOODAFTERNOON'))

如果您有其他条件,用一组额外的括号将整个内容括起来:

WHERE ((:p_type = 'Morning' AND tableABC.name = 'GOODMORNING')
    OR (:p_type = 'Afternoon' AND tableABC.name = 'GOODAFTERNOON')
    OR (:p_type = 'Day' AND tableABC.name IN ('GOODMORNING', 'GOODAFTERNOON')))
AND <something else>

不要使用 decode()。甚至不要使用 case。只需将其表示为布尔逻辑即可:

WHERE (:p_type = 'Morning' AND tableABC.name = 'GOODMORNING') OR
      (:p_type = 'Afternoon' AND tableABC.name = 'GOODAFTERNOON') OR
      (:p_type = 'Day' AND tableABC.name IN ('GOODMORNING', 'GOODAFTERNOON'))