【问题标题】:Understanding a specific WHERE clause in Oracle了解 Oracle 中的特定 WHERE 子句
【发布时间】:2020-12-24 21:46:47
【问题描述】:

我认为这是 Oracle SQL 代码的一部分

雇主.eab_yr ||雇主.eab_no >= 20173 和雇主.eab_yr ||雇主.eab_no

谁能向我解释这部分代码在做什么?

它似乎是从雇主表中获取值,其中 eab_yr 介于 2017 年第 3 个月和 2020 年第 2 个月之间。正确吗?

【问题讨论】:

  • eab_no 列中的值是什么样的?它们看起来像月份数字吗?我不喜欢代码,例如 201712 在数值上大于 20186
  • 从那以后我意识到 eab.no 部分实际上代表一年中的季度(而不是一年中的月份)Q1、Q2、Q3 和 Q4

标签: oracle date where-clause


【解决方案1】:

||是字符串连接运算符,>=是大于等于运算符,<=是小于等于运算符。

因此它匹配employer 的列eab_yreab_no 的字符串连接在数值上大于或等于20173 并且在数值上小于或等于20202 的所有行。

仅此而已。如果不知道关系的语义(可能不止一个,我们无法判断,因为没有给出FROM 子句))和属性的语义,就无法回答语义上的含义。你没有透露这些。

【讨论】:

  • 谢谢。你帮我弄清楚代码在做什么。此外,我已经意识到 eab.no 部分实际上代表一年中的季度(而不是一年中的月份)Q1、Q2、Q3 和 Q4
【解决方案2】:

假设代码是连接年份和月份并试图找到一个范围,那么代码不会像您预期的那样工作。

如果您输入从 2017 年 9 月到 2017 年 12 月的范围,那么您将得到查询:

where employer.eab_yr || employer.eab_no >= 20179
and   employer.eab_yr || employer.eab_no <= 201712

现在,20201 大于数字 20179 并且小于数字 201712,因此您会发现返回 2020 年 1 月(许多其他意想不到的月份也是如此)。

如果您想修复它,请使用 2 位数的月份:

where employer.eab_yr || LPAD( employer.eab_no, 2, '0' ) BETWEEN 201709 AND 201712

或使用日期文字:

where  TO_DATE( employer.eab_yr || '-' || employer.eab_no, 'YYYY-MM' )
         BETWEEN DATE '2017-09-01' AND DATE '2017-12-01'

或者,更好的是,修复您的表格,以便您拥有一个 DATE 列,而不是单独的 yearmonth 列。

db小提琴here

【讨论】:

  • 谢谢。从那以后我发现 eab.no 部分实际上代表一年中的季度(而不是一年中的几个月)Q1、Q2、Q3 和 Q4 感谢您的见解
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 2023-03-31
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多