PDO SQLite 是否支持数学运算的 where 子句?



首先,我很抱歉这个问题的措辞。

我在SQLite数据库中Testing了下表:

| id | name  | something_numerical |
|----|-------|---------------------|
| 1  | test1 | 100                 |
| 2  | test2 | 500                 |
| 3  | test3 | 1000                |
| 4  | test4 | 5000                |
| 5  | test5 | 10000               |
| 6  | test6 | 25000               |

所有查询都从7.3.12-1+0~20191128.49+debian9~1.gbp24559b执行

查询中使用以下别名(这似乎是问题所在(

something_numeric+100 AS modified_column

通过不带占位符的 PDO 进行查询按预期工作,并返回第 3 行和第 4 行。

SELECT *, something_numerical+100 AS modified_column 
FROM Testing 
WHERE modified_column BETWEEN 750 AND 7500

使用占位符通过PDO 进行查询不会返回行和错误。(我还尝试使用?来转换参数,结果相同(

SELECT *, something_numerical+100 AS modified_column 
FROM Testing 
WHERE modified_column BETWEEN :min_modified_column AND :max_modified_column

$parameters = [
':min_modified_column'=>750,
':max_modified_column'=>7500
];

如果不+100something_numerical,两个查询都按预期工作并返回 3 和 4。

这是SQLite数据库,以帮助重现(如有必要(

DROP TABLE IF EXISTS "Testing";
CREATE TABLE "Testing" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" text NOT NULL,
"something_numerical" integer NOT NULL
);
INSERT INTO "Testing" ("id", "name", "something_numerical") VALUES (1,  'test1',    100);
INSERT INTO "Testing" ("id", "name", "something_numerical") VALUES (2,  'test2',    500);
INSERT INTO "Testing" ("id", "name", "something_numerical") VALUES (3,  'test3',    1000);
INSERT INTO "Testing" ("id", "name", "something_numerical") VALUES (4,  'test4',    5000);
INSERT INTO "Testing" ("id", "name", "something_numerical") VALUES (5,  'test5',    10000);
INSERT INTO "Testing" ("id", "name", "something_numerical") VALUES (6,  'test6',    25000);

感谢您的回答。

好的,所以这是一个类型转换问题。

用正确的类型(PDO::PARAM_INT(绑定这些参数中的每一个可以解决这个问题。

$prepared_statement->bindValue(
':min_modified_column', 
750, 
PDO::PARAM_INT
);
$prepared_statement->bindValue(
':max_modified_column', 
7500, 
PDO::PARAM_INT
);

似乎,在没有任何操作的情况下,SQLite/PDO 可以从列类型推断出类型,但在对其内容进行操作后无法再这样做。

以下问题让我走上了正确的轨道

Android/SQLite - WHERE 子句上的位操作

最新更新