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'
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'
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 HEX(pa.text) FROM oc_product_attribute pa WHERE pa.product_id = 19442 AND pa.attribute_id = '35'
3130302520D0BFD0BED0BBD0B8D18DD181D182D0B5D180
SELECT HEX(pa.text) FROM oc_product_attribute pa WHERE pa.product_id = 24074 AND pa.attribute_id = '35'
D182D0B5D0BAD181D182D0B8D0BBD18C
Структура таблицы oc_product_attribute
Что-то у тебя всё плавает... запрос, который по твоему заверению возвращал "Шерсть", тут вернул "100% полиэстер", второй запрос вернул значение с маленькой буквы, хотя в вопросе написано с большой...
SHOW CREATE TABLE oc_product_attribute;
CREATE TABLE `oc_product_attribute` (
`product_id` int(11) NOT NULL,
`attribute_id` int(11) NOT NULL,
`language_id` int(11) NOT NULL,
`text` varchar(255) NOT NULL,
PRIMARY KEY (`product_id`,`attribute_id`,`language_id`),
KEY `1` (`product_id`,`attribute_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
SHOW VARIABLES LIKE 'char%'
SHOW VARIABLES LIKE 'coll%'
Проблема - воспроизводима? т.е. если pa.product_id = 19442 косячит - то косячит абсолютно всегда?
А если выгрузить десяток записей из таблицы, включая и запись для этого продукта, и положить в отдельную таблицу указанной структуры - всё равно проблема воспроизводится?
А если этот же запрос выполнять не через PHP, а из клиента командной строки - проблема так же остаётся и воспроизводима?
SELECT IFNULL((SELECT pa.text FROM oc_product_attribute pa WHERE pa.product_id = 24074 AND pa.attribute_id = '35'), 'NULL');
Предположу что стоит это понимать как то что NULL это специфическое значение, и для SQL и попытка привести к булеан через !(NULL) не работает;
SELECT IF( !(SELECT bla-bla-bla), (SELECT bla-bla-bla), 'NULL');
или
SELECT IF((SELECT bla-bla-bla), (SELECT bla-bla-bla), 'NULL');
сразу лишаются смысла ибо при отсутствии записи будут давать один и тот же вариант.
ибо кастинг null к boolean работать не будет
Который интерпретируется как FALSE
select cast(null as boolean);
select cast(null as text);
select cast(null as int);
select if('шерсть', 1, 2);
select if('cast переменных вещь к которой надо подходить с осторожностью!', 1, 2);
select if('true', 1, 2);
select if(null, 1, 2);
select if(!(null), 1, 2);
Null не может никак интерпретироваться.
а теперь давайте усложним, представим что вложенный запрос возвращает шерсть.
select if('шерсть', 1, 2);
Что "весело"? Всё логично и однозначно.
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
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 if(!('100% полиэстер'), '100% полиэстер', 'NULL');
SELECT IFNULL((SELECT pa.text FROM oc_product_attribute_test pa WHERE pa.product_id = 19442 AND pa.attribute_id = '35'), 'NULL');
SELECT IFNULL((SELECT pa.text FROM oc_product_attribute_test pa WHERE pa.product_id = 24074 AND pa.attribute_id = '35'), 'NULL');
SELECT pa.text FROM oc_product_attribute_test pa WHERE pa.product_id = 19442 AND pa.attribute_id = '35'
так я NULL ни с чем её не сравниваю и не привожу)))
Но я понимаю что разработчик не дурак и не спроста обернул простой запрос в конструкцию IF (в вашем варианте IFNULL)
echo (null)?'yes':'no';
no
echo !(null)?'yes':'no';
yes
echo ('wtf')?'yes':'no';
yes
echo !('wtf')?'yes':'no';
no
в данном запросе должно было вернуться не Шерсть, а 100% полиэстер
SELECT IF( !('100% полиэстер'), '100% полиэстер', 'NULL' )
SELECT IF( ! 100, '100% полиэстер', 'NULL' )
SELECT IF( FALSE, '100% полиэстер', 'NULL' )
Просто единственный смысл который я вижу это возвращение NULL вместо пустого запроса, но чем его пустой ответ в этом случай не устраивал непонятно.
Есть ощущение что есть какой-то более прикладной смысл.
Теперь понятно, почему возвращается 'NULL'?