解码Oracle SQL中的多个值

时间:2018-09-21 11:40:56

标签: sql oracle where decode

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

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

不幸的是,它不起作用。我不能使用任何其他表格,因为它用于报表中并且“ Morning,Afternoon,Day”是虚构的单词(它应该是用户友好的)。秒数确实存在于表格中,但此列还有许多下一个值(例如:“ GOODEVENING”,“ GOODNIGHT”)。 我只需要从特定列中选择两个值,并在“天”选项下选择许多不同的值即可。

非常感谢, D。

2 个答案:

答案 0 :(得分:2)

您不能像这样将比较条件从=更改为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>

答案 1 :(得分:0)

请勿使用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'))