【问题标题】:Unexpected behavior in SQLite query using random()使用 random() 的 SQLite 查询中的意外行为
【发布时间】:2015-09-11 19:03:38
【问题描述】:
SELECT random() as r from my_tbl where r < 0 LIMIT 10

返回 10 个数字,但有些是正数,这不是我所期望的。这是 SQLite 中的错误吗?

【问题讨论】:

  • 刚刚运行查询,我明白你的意思了!确实是最出乎意料的。大多数开发人员可能还没有遇到过这种情况,因为 random 更常用,例如 'SELECT * FROM my_tbl ORDER BY random() LIMIT 10"

标签: sqlite function random deterministic


【解决方案1】:

SELECT 子句中的表达式是查询的输出,因此它们是在行被过滤后计算的。 因此,SQL 标准禁止在查询的任何其他子句中使用输出别名(例如r)。

SQLite 无论如何都允许这样做,但效果并不总是您想要的。 AS 只是 重命名 一个输出列(即,它为表达式提供一个短名称),所以当你在 WHERE 子句中使用这样的别名时,你得到的不是 的输出列,而是原始 表达式 的副本。效果一样:

SELECT random() FROM my_tbl WHERE random() < 0 LIMIT 10;

【讨论】:

  • 谢谢!是否有一种解决方法可以让我选择查询生成的负数?
  • 是的;但是您要解决的实际问题是什么?
  • 我有一个UDF,它以一个城市作为字符串并返回该城市的当前温度。我的数据库的用户正在编写查找负温度城市的查询。但是发生的情况是,第一次调用我的 UDF 时,城市的温度为负值,但在第二次调用它时,温度为正值。结果是用户看到的结果与查询条件(pos. temps)不一致。即使温度不再是负值,用户也会喜欢在结果中看到负温度或根本看不到结果行。
  • 那么问题是温度在变化吗?处理这种情况的最佳方法是创建一个带有数据快照的临时表。
猜你喜欢
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 2011-10-06
相关资源
最近更新 更多