查询中的“列”IS NOT NULL在列不存在时不会抛出错误

时间:2012-12-18 10:32:34

标签: php sqlite laravel notnull

在我的PHP单元测试中,我使用的是SQLite内存数据库,其中包含下表:

CREATE TABLE "battlegroup_request" (
  "id" INTEGER NULL PRIMARY KEY AUTOINCREMENT,
  "battlegroupID" INTEGER NULL,
  "inviterID" INTEGER NULL,
  "inviteeID" INTEGER NULL
)

当我使用两个整数绑定执行以下查询时;

SELECT *
FROM "battlegroup_request"
WHERE "inviteeid" = ? AND
  "inviter" IS NOT NULL AND
  "battlegroupid" = ?
LIMIT 1

查询返回一个结果,但我希望它抛出错误,因为列inviter不存在。这是SQLite的预期行为吗?我做错了吗?

我正在使用PDO,连接创建如下:

new PDO(
    'sqlite::memory:',
    null,
    null,
    array(
        PDO::ATTR_CASE => PDO::CASE_LOWER,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
        PDO::ATTR_STRINGIFY_FETCHES => false,
        PDO::ATTR_EMULATE_PREPARES => false,
    )
);

(这些选项是Laravel的默认选项,这是我们正在使用的框架。)

1 个答案:

答案 0 :(得分:4)

如果你使用类似的东西:

SELECT "inviter" IS NOT NULL FROM battlegroup_request

如果列inviter不存在,它将返回TRUE,因为SQLite会将"inviter"视为字符串值(此处肯定不是NULL)。

但是,如果你删除双引号:

SELECT inviter IS NOT NULL FROM battlegroup_request

如果列inviter不存在,它将引发异常。

编辑:使用反引号也会强制SQLite将其视为名称(不是字符串):

SELECT `inviter` IS NOT NULL FROM battlegroup_request
如果列inviter不存在,

将引发异常。