Поддерживает ли PDO SQLite операторы where по математическим операциям? - PullRequest
0 голосов
/ 30 января 2020

Прежде всего, извините за формулировку вопроса.

У меня есть следующая таблица Testing в базе данных SQLite:

| 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
];

Без +100 для столбца something_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);

Спасибо за ваши ответы.

1 Ответ

0 голосов
/ 30 января 2020

Хорошо, это была проблема приведения типа.

Привязка каждого из этих параметров к нужному типу (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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...