Проверка sqlite datetime NULL с RoR - PullRequest
       0

Проверка sqlite datetime NULL с RoR

0 голосов
/ 15 августа 2010

Новичок RoR / SQL здесь.

Мой столбец даты и времени 'deleted_at' не инициализирован.Выполнение этого запроса возвращает ошибку:

SELECT * FROM variants v
 ON v.id = ovv0.variant_id INNER JOIN option_values_variants ovv1
 ON v.id = ovv1.variant_id INNER JOIN option_values_variants ovv2
 ON v.id = ovv2.variant_id INNER JOIN option_values_variants ovv3
 ON v.id = ovv3.variant_id INNER JOIN option_values_variants ovv4
 ON v.id = ovv4.variant_id
 WHERE v.deleted_at = NULL
 AND v.product_id = 1060500595

Однако, если я установлю свои значения даты и времени на 0, а свой запрос на v.deleted_at = 0, мне вернется правильный вариант.

Как проверить дату / время неинициализированного / NULL?

Ответы [ 3 ]

5 голосов
/ 22 сентября 2012

В SQLite вы можете использовать оператор IS, чтобы проверить, что что-то имеет значение NULL:

WHERE v.deleted_at IS NULL
1 голос
/ 16 августа 2010

Я считаю, что ваша главная ошибка в том, что ovv0 не определен. Укажите свой inner join, а затем свой пункт.

SELECT * FROM variants v 
INNER JOIN option_values_variants ovv0 ON v.id = ovv0.variant_id
INNER JOIN option_values_variants ovv1 ON v.id = ovv1.variant_id
INNER JOIN option_values_variants ovv2 ON v.id = ovv2.variant_id
INNER JOIN option_values_variants ovv3 ON v.id = ovv3.variant_id
INNER JOIN option_values_variants ovv4 ON v.id = ovv4.variant_id
WHERE v.deleted_at = NULL AND v.product_id = 106050059;

Я также хотел бы, чтобы мы выяснили, почему вы используете так много внутренних объединений на одном столе. Что вы пытаетесь достичь?

EDIT:

Для пустых значений SQLite сложен и считает пустым тип. Также не существует истинного типа даты и времени. Вы можете проверить тип столбца с помощью функции typeof, которая возвращает строку.

SELECT * FROM variants v 
...
WHERE typeof(v.deleted_at) = 'null' AND v.product_id = 106050059;

Пересоздать:

Там также ifnull. Эта функция заменяет нуль на любое значение, которое вы хотите. Так что в вашем случае, с помощью одной команды вы можете проверить натуральные 0 и нули в одном кадре. Если вы не хотите иметь натуральные 0 и только нули, используйте другое значение, которое не должно быть датой (скажем, -1), и сравните его.

SELECT * FROM variants v 
...
WHERE ifnull(v.deleted_at,0) = 0 AND v.product_id = 106050059;
0 голосов
/ 24 июля 2017

В SQL вы не можете использовать = для сравнения нулей, вместо этого вы должны использовать IS NULL ИЛИ NOT NULL .

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