sql - 为什么查询中的 "Where 1 <> 1"会返回所有行?

标签 sql oracle views

我在继承的应用程序中遇到了一个查询,如下所示:

Select *
From foo
where
    1 <> 1

当我解析它时,它应该什么都不返回(1 <> 1 应该评估为假,对)。然而(至少在我的 Oracle 机器上)它返回了 foo 中所有内容的完整列表。 .当我在 MSAccess/Jet 和 MSSQL 中尝试同样的事情时,我得到了我期望的行为。
为什么 Oracle 会有所不同(以及最初的开发人员为什么要这样做)?

注意:我看到了一些关于使用“where 1 = 1”的 +s 和 -s 的迷信,它会导致全表扫描;但我不认为这是原始开发人员的意图。

小更新:
在这种情况下 foo是一种观点。当我在实际的 table 上尝试同样的事情时,我得到了我所期望的(没有行)。

更新 2:
我已经在兔子洞中进一步跟踪代码,并确定他所做的只是尝试获取字段/列名称。我仍然不知道为什么它会返回完整的记录集;但仅限于意见。

从字面上看,他在一个字符串中构建查询并将其传递给另一个函数以原样执行。
'VB6
strSQL = "SELECT * FROM " & strTableName & " WHERE 1 <> 1"

在这种情况下, strTableName 包含 View 的名称。

更新 3:
作为引用,这是我遇到问题的观点之一
(我已经更改了字段/表/架构名称)
CREATE OR REPLACE FORCE VIEW scott.foo (field1,
                                        field2,
                                        field4,
                                        field5,
                                        field12,
                                        field8,
                                        field6,
                                        field7,
                                        field16,
                                        field11,
                                        field13,
                                        field14,
                                        field15,
                                        field17
                                       )
AS
   SELECT   bar.field1,
            bar.field2,
            DECODE
               (yadda.field9, NULL, 'N',
                DECODE (yadda.field3, NULL, 'Y', 'N')
               ) AS field4,
            bar.field5,
            snafu.field6,
            DECODE
                (snafu.field6,
                 NULL,
                bar.field8,
                   bar.field8
                 - snafu.field6
                ) AS field7,
            DECODE
               (yadda.field10,
                NULL,
            bar.field12,
                yadda.field10
               ) AS field11,
            DECODE
               (SIGN (  yadda.field10 - bar.field12),
                NULL, 'N', 1, 'N', 0, 'N', -1, 'Y'
               ) AS field13,
            bar.field14,
            ADD_MONTHS
               (DECODE (yadda.field10, NULL, bar.field12, yadda.field10
                       ),
                bar.field14 * 12
               ) AS field15,
       FROM clbuttic,
            bar,
            yadda,
            snafu
      WHERE clbuttic.asset_type = bar.asset_type
        AND bar.field16 = yadda.field9(+)
        AND bar.field1 = snafu.field1(+)
        AND (bar.field17 IS NULL)
   ;

附加 Order By 1 (或 foo 上的选择中的某些列名)似乎说服 Oracle 将空集归还给我。这是一个长期解决方案,但不是短期解决方案(更改代码和重新部署是一个主要的 PITA)。我希望 DB 端有一个鲜为人知的设置,或者 View 中有一些错误是导致这种奇怪行为的原因。

最佳答案

好的...为什么这会发生在 Oracle 超出我的范围。但是,我可以告诉您为什么它经常在其他数据库中使用:当人们希望返回列但没有值时。 (例如为新表创建架构)

关于sql - 为什么查询中的 "Where 1 <> 1"会返回所有行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/663187/

相关文章:

sql - 在 Firebird 中使用 "Inappropriate self-reference of column"时为 "with check option"

performance - Couchdb 1.5 和 Node JS 查询服务器

php - 我想在发布后获得一个 id(自动增量)并将其发布到其他表中

oracle - 使用ODI 12c进行hadoop配置

sql - 使用 sqlplus 设置要返回的最大行数

sql - 识别sql中不为空值的行

android - 点击前景 View

sql - ActiveRecord 连接

MySql 查询字符串部分

php - 检查 MySQL 行中的值