在 WHERE 子句中按 TO_CHAR() 过滤[重复]
Posted
技术标签:
【中文标题】在 WHERE 子句中按 TO_CHAR() 过滤[重复]【英文标题】:Filter by TO_CHAR() in the WHERE clause [duplicate] 【发布时间】:2019-12-10 22:02:06 【问题描述】:我遇到了一些意想不到的行为,这对我来说没有任何意义。
我有一个带有TIMESTAMP(6)
列的表格。
如果我执行以下查询:
SELECT DISTINCT TO_CHAR(ssef.SS_TIMESTAMP, 'DAY') FROM SS_EDGE_FORECAST ssef
我得到以下结果:
FRIDAY
TUESDAY
SUNDAY
SATURDAY
MONDAY
THURSDAY
到目前为止一切顺利。
但是,如果我尝试通过在 WHERE
子句中指定特定工作日来过滤查询结果,则不会得到任何结果:
SELECT * FROM SS_EDGE_FORECAST ssef
WHERE TO_CHAR(ssef.SS_TIMESTAMP, 'DAY') = 'MONDAY'
这似乎是一个直接的矛盾。
为什么TO_CHAR
操作会在SELECT
子句中产生正确的结果,而在WHERE
子句中却不行?
为什么我可以选择某些内容,但不能能够过滤基于相同的项目?
【问题讨论】:
【参考方案1】:这里的问题是,TO_CHAR(x,'DAY') 用于星期一返回 'Monday ',最后有空格。根据 TO_CHAR 函数的文档:
字符元素 MONTH、MON、DAY 和 DY 填充有 拖尾空格到最长的完整月份名称的宽度, 最长的缩写月份名称,最长的完整日期名称...
如果您执行以下操作,将返回正确的结果:
SELECT * FROM SS_EDGE_FORECAST ssef WHERE TO_CHAR(ssef.SS_TIMESTAMP, 'DAY') like 'MONDAY%'
或者更好的是,TO_CHAR 函数具有所谓的格式模型修饰符,您可以使用它来删除这些尾随空格:
SELECT * FROM SS_EDGE_FORECAST ssef WHERE TO_CHAR(ssef.SS_TIMESTAMP, 'fmDAY') = 'MONDAY'
应返回所需的输出。
TO_CHAR 和格式模型修饰符的文档: https://docs.oracle.com/database/121/SQLRF/sql_elements004.htm#SQLRF00216
【讨论】:
【参考方案2】:首先解决办法是:
SELECT * FROM TEST1
WHERE TRIM(TO_CHAR(ABC,'DAY')) = 'MONDAY'
增加修剪功能。
原因是:
TO_CHAR(TIMESTAMP,'DAY') 将返回 9 个字符串。显然,“星期一”末尾有 3 个尾随空格
这是测试用例:
DB<>Fiddle
【讨论】:
【参考方案3】:这是一个空白/修剪问题。
试试这个:
SELECT DISTINCT TO_CHAR(sysdate, 'DAY') FROM dual ssef where TRIM(TO_CHAR(sysdate, 'DAY'))='TUESDAY';
【讨论】:
以上是关于在 WHERE 子句中按 TO_CHAR() 过滤[重复]的主要内容,如果未能解决你的问题,请参考以下文章