【问题标题】:Unexpected SELECT output from SQLite来自 SQLite 的意外 SELECT 输出
【发布时间】:2021-01-12 20:26:50
【问题描述】:

5 分钟前正在测试针对 SQLite 数据库的查询,并使用 < 运算符遇到以下问题。这是信息:

[表架构]

CREATE TABLE products (
    name      TEXT,
    number    TEXT,
    category  TEXT,
    quantity  TEXT,
    available TEXT,
    price     TEXT,
    info      TEXT,
    prodlinks TEXT,
    pictures  BLOB
);

根据quantity 值,我正在搜索特定的数据库中保存了 100 个项目:

SELECT * FROM products WHERE quantity < 2;

此查询用于php脚本(部分):

$result = $db->prepare("SELECT * FROM products WHERE quantity < 2");
$result->execute();
$result = $result->fetchAll(PDO::FETCH_ASSOC);

结果是所有 quantity 低于 2 的项目都被退回,但有 quantity 值高于 2 的退回项目 - 例如 11 或 15。以前从未见过,所以你知道在哪里是问题吗?如果 &lt; 运算符与 &gt; 反转,则不返回数量为 11 或 15 的项目。

【问题讨论】:

  • 数量与字符串相关联 - 您应该先转换它。
  • 为什么数量是文本?对于字符串,有 '15'
  • 总的来说,正如其他人已经提到的那样,您的架构是完全错误的。从中查询任何数据都会遇到更多问题。数据库提供多种数据类型是有原因的。
  • 从上面的 cmets 也如下所示,您可以将价格以美分表示为整数,而不是美元金额以浮点数或文本表示。
  • 感谢 cmets。我不是数据库人,由一个离开半工作系统的人写的

标签: php sql sqlite select


【解决方案1】:

quantity 列定义为text,因此&lt; 运算符将按字典顺序解释。如果可以,您可能应该将其重新定义为integer。如果这不可能,您需要在查询时强制转换它:

SELECT * FROM products WHERE CAST(quantity AS INTEGER) < 2

【讨论】:

  • 好的,这行得通,但哪个更好 - 强制转换或重新定义列?
  • @1000Gbps 如果可以的话,一定要重新定义列。 quantity 是一个数值,应该这样保存。
  • 1000Gbps:重新定义列。始终使用适当的数据类型。否则,您将不得不在每个查询中编写此类变通方法,否则可能会在这里和那里产生意想不到的副作用。
  • 似乎用REAL 重新定义price 列会去掉价格十进制值,即在5.60 之类的转换值变成5.6 之后
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 2019-11-04
  • 2018-08-21
相关资源
最近更新 更多