我有一个测试SQLite表,用于存储具有值的报告数据:
CREATE TABLE IF NOT EXISTS "test_fact_daily_revenue" (
"date" TEXT,
"revenue" NUMERIC,
"product" TEXT
);
INSERT INTO "test_fact_daily_revenue"
("date", "revenue", "product")
VALUES
('2014-01-01', 3, 'Nerds'),
('2014-01-01', 2, 'Laffy Taffy'),
('2014-01-02', 1, 'Smarties'),
('2014-01-02', 5, 'Laffy Taffy'),
('2014-01-03', 0.5, 'Smarties'),
('2014-01-03', 1, 'Skittles');
我正在验证收入列是否被理解为数字/整数,并且使用收入列进行的比较是否正常运行:
SELECT
typeof(SUM(revenue)) AS revenue,
typeof(product) AS product
FROM test_fact_daily_revenue
WHERE revenue > 1
GROUP BY product;
integer|text
integer|text
但是当我尝试使用收入列的聚合(SUM)来执行HAVING子句时,结果是不正确的。 7不小于5.
SELECT
test_fact_daily_revenue.product AS "product",
SUM(test_fact_daily_revenue.revenue) AS "revenue"
FROM "test_fact_daily_revenue"
WHERE
"test_fact_daily_revenue"."product" IS NOT NULL
GROUP BY "test_fact_daily_revenue"."product"
HAVING
SUM(test_fact_daily_revenue.revenue) < 5
Laffy Taffy|7
Nerds|3
Skittles|1
Smarties|1.5
如果我用MySQL重复完全相同的测试,它会按预期工作,过滤掉Laffy Taffy行。对此有一个很好的解释吗?
答案 0 :(得分:2)
这是PHP PDO驱动程序和预处理语句的问题!如果绑定参数是PHP浮点数,则以下预处理语句不起作用,因为PHP只能将其绑定为INTEGER或STRING(并且字符串是小数的推荐参数类型)。因为我的列可能有DECIMAL值,所以我使用的库将它绑定为STRING。 SQLite对字符串比较有奇怪的行为,即使它们是数字的。为了解决它,我将不得不避免准备好的陈述......: - (
SELECT
test_fact_daily_revenue.product AS "product",
SUM(test_fact_daily_revenue.revenue) AS "revenue"
FROM "test_fact_daily_revenue"
WHERE
"test_fact_daily_revenue"."product" IS NOT NULL
GROUP BY "test_fact_daily_revenue"."product"
HAVING
SUM(test_fact_daily_revenue.revenue) < ?