【问题标题】:Multiple values in decode Oracle SQL解码 Oracle SQL 中的多个值
【发布时间】:2018-09-21 11:40:56
【问题描述】:

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

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

不幸的是,它不起作用。我不能使用任何其他表格,因为它用于报告中,并且“早上,下午,白天”是想象出来的词(它应该是用户友好的)。秒数确实存在于表中,但该列也有许多下一个值(例如:'GOODEVENING'、'GOODNIGHT')。 我只需要从具有许多不同值的特定列中选择两个值,这些值将在“日”选项下进行选择。

非常感谢, D.

【问题讨论】:

  • 你的问题不清楚..更新..并添加适当的数据样本.和预期的结果

标签: sql oracle where decode


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    不要使用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'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      相关资源
      最近更新 更多