在 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() 过滤[重复]的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 where 子句从特定列过滤

[MySQL] 过滤数据

postgres:是不是按返回顺序应用 where 子句过滤器

MySQL-过滤数据(WHERE语句)

Powershell where子句过滤

sql 在WHERE子句中有用的检查/过滤