从 sqlite 表中选择记录时出错

Posted

技术标签:

【中文标题】从 sqlite 表中选择记录时出错【英文标题】:Error in select record from sqlite table 【发布时间】:2016-06-27 09:05:40 【问题描述】:

我在 SQLITE 中有一个表:

CREATE TABLE "INVENTORY" (
    "product" VARCHAR NOT NULL, 
    "version" VARCHAR NOT NULL, 
    "productionDate" VARCHAR NOT NULL,
    "order" VARCHAR NOT NULL,
    "AA" VARCHAR NOT NULL, 
    "quantity" INTEGER,
    "location" INTEGER,
    "barcode" VARCHAR,   
    PRIMARY KEY ("product", "version", "productionDate", "AA", "order")
);

当我尝试选择一条记录(它存在)时:

SELECT * FROM INVENTORY 
WHERE (product='25120171' AND version='02' AND productionDate='091014' AND AA='001' AND order='4420')

我收到一个错误

SQLiteManager:可能的 SQL 语法错误:SELECT * FROM INVENTORY WHERE (product='25120171' AND version='02' AND productionDate='091014' AND AA='001' AND order='4420') [“order”附近:语法错误] 异常 名称:NS_ERROR_FAILURE 异常消息:组件返回失败 代码:0x80004005(NS_ERROR_FAILURE) [mozIStorageConnection.createStatement]

如果我从选择查询中删除AND order='4420'

SELECT * FROM INVENTORY 
    WHERE (product='25120171' AND version='02' AND productionDate='091014' AND AA='001');

它有效。我找不到错误在哪里...

【问题讨论】:

【参考方案1】:

使用 order 作为列名可能是导致错误的原因。

As the doc says

SQL 标准指定了大量的关键字,这些关键字不能用作表、索引、列、数据库、用户定义函数、排序规则、虚拟表模块或任何其他命名对象的名称。关键字列表太长了,很少有人能全部记住。对于大多数 SQL 代码,最安全的选择是永远不要使用任何英语单词作为用户定义对象的名称。

order 就是其中之一。

您可以重新编写查询以转义列名:

SELECT * FROM INVENTORY 
WHERE (product='25120171' AND version='02' AND productionDate='091014' AND AA='001' AND `order`='4420')

【讨论】:

以上是关于从 sqlite 表中选择记录时出错的主要内容,如果未能解决你的问题,请参考以下文章

SQLite查询选择另一个表中不存在的所有记录

如何使用Android从sqlite中的表中删除所有记录?

如何在 SQLite 表中插入日期和查询日期

从 sqlite 表中选择随机行

如何提高 SQLite 数据库的性能?

如何从 SQLite 中的表中选择最新的 100 个不同条目?