@hoindex

Почему sql запрос возвращает NULL?

Всем доброго дня!
В наследство достался сайт магазин с 80 этажным генератором отчетов через cron + shell script.
Сейчас заметили что по некоторым товарам генерятся некорректные данные, в частности для поля состав возвращается NULL, хотя по факту поле заполнено.
Начал смотреть и вижу что содержимое генерится запросом
SELECT IF(
    !(SELECT pa.text FROM oc_product_attribute pa WHERE pa.product_id = 19442 AND pa.attribute_id = '35'),
     (SELECT pa.text FROM oc_product_attribute pa WHERE pa.product_id = 19442 AND pa.attribute_id = '35'),
'NULL'
)


При этом запрос
SELECT pa.text FROM oc_product_attribute pa WHERE pa.product_id = 19442 AND pa.attribute_id = '35'

Возвращает корректное значение - 100% полиэстер

Если убрать !
IF(
    (SELECT pa.text FROM oc_product_attribute pa WHERE pa.product_id = 19442 AND pa.attribute_id = '35'),
    (SELECT pa.text FROM oc_product_attribute pa WHERE pa.product_id = 19442 AND pa.attribute_id = '35'),
'NULL'
)

тоже возвращает корректное значение.

Всё бы ничего, но для некоторых товаров возвращается корректное значение...
SELECT IF(
    !(SELECT pa.text FROM oc_product_attribute pa WHERE pa.product_id = 24074 AND pa.attribute_id = '35'),
    (SELECT pa.text FROM oc_product_attribute pa WHERE pa.product_id = 24074 AND pa.attribute_id = '35'),
'NULL'
)

Возвращает - Текстиль

При этом упрощенный запрос
SELECT pa.text FROM oc_product_attribute pa WHERE pa.product_id = 24074 AND pa.attribute_id = '35'

ничего не возвращает...

Как это вообще понимать?

UPDATE
Кое что проясняется.
Запрос
SELECT IF(
    !(SELECT pa.text FROM oc_product_attribute pa WHERE pa.product_id = 19442 AND pa.attribute_id = '35'),
    (SELECT pa.text FROM oc_product_attribute pa WHERE pa.product_id = 19442 AND pa.attribute_id = '35'),
'NULL'
)

Возвращает NULL вместо 100% полиэстер (Шерсть в изначальном вопросе попала туда от другого товара).
Но, phpMyadmin пишет Warning: #1292 Truncated incorrect DOUBLE value: '100% полиэстер'

Структура таблицы oc_product_attribute - https://s.mail.ru/96sf/scGaYa4Af

Что-то я не понял при чем тут DOUBLE...
  • Вопрос задан
  • 570 просмотров
Решения вопроса 1
iMedved2009
@iMedved2009
Не люблю людей
Предположу что стоит это понимать как то что NULL это специфическое значение, и для SQL и попытка привести к булеан через !(NULL) не работает;
Если я правильно понял то что здесь хотят сделать то вам стоит использовать функции для работы с null, такие как IFNULL, COALESCE.

SELECT IFNULL((SELECT pa.text FROM oc_product_attribute pa WHERE pa.product_id = 24074 AND pa.attribute_id = '35'), 'NULL');
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы