了解 Oracle 中的特定 WHERE 子句
Understanding a specific WHERE clause in Oracle
我将其视为 Oracle SQL 代码的一部分
其中employer.eab_yr || employer.eab_no >= 20173
和 employer.eab_yr || employer.eab_no <= 20202
任何人都可以向我解释这部分代码的作用吗?
它似乎是从雇主 table 获取值,其中 eab_yr 介于 2017 年第 3 个月和 2020 年第 2 个月之间。对吗?
||
是字符串连接运算符,>=
是大于或等于运算符,<=
是小于或等于运算符。
所以它匹配 employer
的 eab_yr
和 eab_no
列的字符串连接在数值上大于或等于 20173
且在数值上小于的所有行或等于 20202
.
仅此而已。如果不知道关系(可能不止一个,我们无法判断,因为没有给出 FROM
子句))和属性的语义,就无法回答这在语义上意味着什么。你没有透露那些。
假设代码连接年份和月份并试图找到一个范围,那么代码不会像您预期的那样工作。
如果你把范围从 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'
或者,更好的是,修正你的 table,这样你就有一个 DATE
列,而不是单独的 year
和 month
列。
db<>fiddle here
我将其视为 Oracle SQL 代码的一部分
其中employer.eab_yr || employer.eab_no >= 20173 和 employer.eab_yr || employer.eab_no <= 20202
任何人都可以向我解释这部分代码的作用吗?
它似乎是从雇主 table 获取值,其中 eab_yr 介于 2017 年第 3 个月和 2020 年第 2 个月之间。对吗?
||
是字符串连接运算符,>=
是大于或等于运算符,<=
是小于或等于运算符。
所以它匹配 employer
的 eab_yr
和 eab_no
列的字符串连接在数值上大于或等于 20173
且在数值上小于的所有行或等于 20202
.
仅此而已。如果不知道关系(可能不止一个,我们无法判断,因为没有给出 FROM
子句))和属性的语义,就无法回答这在语义上意味着什么。你没有透露那些。
假设代码连接年份和月份并试图找到一个范围,那么代码不会像您预期的那样工作。
如果你把范围从 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'
或者,更好的是,修正你的 table,这样你就有一个 DATE
列,而不是单独的 year
和 month
列。
db<>fiddle here