【问题标题】:Case expression inside a where clause - Oraclewhere 子句中的 case 表达式 - Oracle
【发布时间】:2015-12-07 13:39:14
【问题描述】:

我有一列日期,其中包含 2 种不同格式的数据:yyyy-mm-dd 和 dd/mm/yyyy。 因此,我必须识别日期的格式,以便将它们转换为正确的格式。我的SQL查询如下:

select *
from teste
where
    (CASE
        WHEN data like '%-%' THEN
            TO_DATE(data, 'yyyy-mm-dd') BETWEEN
            TO_DATE(01/01/2000, 'dd/mm/yyyy') AND 
            TO_DATE(01/01/2016, 'dd/mm/yyyy')
        ELSE
            TO_DATE(data, 'dd/mm/yyyy') BETWEEN 
            TO_DATE(01/01/2000, 'dd/mm/yyyy') AND 
            TO_DATE(01/01/2016, 'dd/mm/yyyy')
    END)

运行这个,我得到错误: 00905. 00000 - “缺少关键字” *原因:
*行动: Erro na linha:6 科卢纳:35。

似乎是 between 子句有问题。谁能帮我解决这个问题?

【问题讨论】:

  • 不用提了,但现在您知道为什么应该从不将日期存储为字符串。
  • 问题是:不是我创建表,也不是向数据库插入数据。

标签: oracle date case between


【解决方案1】:

CASE 表达式返回一些值。您应该将此值与某物进行比较。您不能将整个表达式放在 CASE 中。

例如

select *
from teste
where
    CASE WHEN data like '%-%' THEN
      TO_DATE(data, 'yyyy-mm-dd') 
    ELSE
      TO_DATE(data, 'dd/mm/yyyy') 
    END 
  BETWEEN  TO_DATE(01/01/2000, 'dd/mm/yyyy') AND 
            TO_DATE(01/01/2016, 'dd/mm/yyyy')

【讨论】:

  • 非常感谢它的工作!另外,我需要在 order by 子句中排序日期。我怎样才能在这个中应用相同的逻辑?
  • ORDER BY CASE WHEN data like '%-%' THEN TO_DATE(data, 'yyyy-mm-dd') ELSE TO_DATE(data, 'dd/mm/yyyy') END
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多