Сравнение двух столбцов: <= не работает, но> = работает - PullRequest
1 голос
/ 08 октября 2019

Я хочу выбрать column1 данные, где они меньше или равны column2. Однако, когда я пытаюсь использовать <=, я получаю пустой результат, несмотря на наличие данных в column1, которые меньше column2.

Мой код:

router.get('/', function(req, res, next) {
    db('items').select().where('column1', '<=', 'column2').then((notify)=>{
      console.log(notify)
      res.render('index', { title: 'Express', notify:notify })
  })
})

ирезультат:

[]

, который, как вы видите, пуст!

Если я использую больше или равно:

 .where('column1', '>=', 'column2')

Я получу все строки:

[ RowDataPacket {
    column_id: 1,
    column1: 99,
    column2: 10, },
  RowDataPacket {
    column_id: 2,
    column1: 10,
    column2: 10, },
  RowDataPacket {
    column_id: 3,
    column1: 29,
    column2: 12,} ]

Почему это?

1 Ответ

0 голосов
/ 08 октября 2019

Проблема в том, что SQL работает таким образом, а Knex - нет! Knex сравнивает значение column1 со строкой 'column2'. Таким образом, это было бы, как если бы мы запустили SQL-запрос:

SELECT * FROM items
    WHERE column1 <= 'column2';

Теперь в MySQL (MariaDB в моих примерах) сравнение <= для целого числа со строкой возвращает 0 (false),Однако сравнение >= возвращает 1, что объясняет запутанные результаты, которые вы видите. В некоторых других базах данных будет отображаться ошибка (например, Postgres):

postgres=# SELECT 1 <= 'foo';
ERROR:  invalid input syntax for integer: "foo"
LINE 1: SELECT 1 <= 'foo';                   ^

, но MariaDB позволит вам сойти с рук:

MariaDB [(none)]> SELECT 1 <= 'foo';
+------------+
| 1 <= 'foo' |
+------------+
|          0 |
+------------+
1 row in set (0.000 sec)

MariaDB [(none)]> SELECT 1 >= 'foo';
+------------+
| 1 >= 'foo' |
+------------+
|          1 |
+------------+
1 row in set (0.000 sec)

Чтобы решить эту проблему, необходимо сообщить Knexчто вы на самом деле хотите получить значение столбца в правой части сравнения, а не строку. Вы можете сделать это, используя knex.ref. Попробуйте это:

db("items")
  .where("column1", "<=", db.ref("column2"))
  .then(console.log)
  .catch(console.error);

См. Также: С помощью knexjs как сравнить два столбца в функции .where ()? .

...