为啥这条 SQL 语句不起作用?

Posted

技术标签:

【中文标题】为啥这条 SQL 语句不起作用?【英文标题】:Why won't this SQL statement work?为什么这条 SQL 语句不起作用? 【发布时间】:2008-10-27 15:54:29 【问题描述】:

我有以下 SQL 语句:

SELECT DISTINCT name FROM log WHERE NOT name = '' AND name LIKE '%.EDIT%';

它在 Postgres 上运行良好(从日志中返回所有不同的名称,它们不为空并且包含字符串 '.EDIT')。但在 Oracle 上,这条语句不起作用。知道为什么吗?

【问题讨论】:

【参考方案1】:
SELECT DISTINCT name FROM log WHERE NOT name = '' AND name LIKE '%.EDIT%';

1) Oracle 将 '' 视为 NULL,这意味着比较 "NOT name = ''" 永远不会为真或假;改用“IS NOT NULL”。但是……

2) 第二个条件“name LIKE '%.EDIT%' 无论如何都不会匹配一个空字符串,使得第一个条件变得多余。

所以改写为:

SELECT DISTINCT name FROM log WHERE name LIKE '%.EDIT%';

【讨论】:

感谢您的帮助。它工作正常!对于多余的东西,我真是个白痴。但我也不知道,Oracle 将 '' 视为 NULL。谢谢,现在可以了。【参考方案2】:

Oracle中的空字符串相当于NULL,导致比较失败。 将查询的那部分更改为 NAME IS NOT NULL

【讨论】:

【参考方案3】:

您可以在没有“NOT NAME=''”子句的情况下重写该查询。

 SELECT DISTINCT name 
 FROM log
 WHERE name LIKE '%.EDIT%';

这对你有用吗?

如果不是,它在什么方面不起作用?它会导致错误吗?是否返回了错误的结果?

请使用此信息扩展您的问题 :-)

【讨论】:

以上是关于为啥这条 SQL 语句不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 IF NOT EXISTS 语句不起作用?

为啥这个 if 语句在这种情况下不起作用? [关闭]

socket.io:为啥这个广播语句不起作用?

为啥这个 VBA if 语句不起作用?

为啥这个准备语句在 MYSQLI 中不起作用?

为啥我的 C# IS 语句不起作用?