Оператор Select where, возвращающий все значения null

#java #mysql #sql #null #where-clause

#java #mysql #sql #нулевой #where-предложение

Вопрос:

Я использую java для изменения таблицы. после выполнения этого кода

 tab=b[i];

myStatement.executeUpdate("UPDATE hetero.temporary SET CatTable = ' " tab " ' WHERE CatTable IS NULL");
 

моя таблица изменена

  ---------------------------------------------- 
| '1', 'Achilles Tendon',  ' Bodyparts ', '0'  |
| '2', 'Adenoids',         ' Bodyparts ', '0'  |
| '3', 'Adrenaline',       ' Bodyparts ', '0'  |
| '4', 'Alimentary Canal', ' Bodyparts ', '0'  |
 ---------------------------------------------- 
 

но используя

 SELECT * 
FROM hetero.temporary
Where Cattable LIKE 'Bodyparts '
 

ВОЗВРАТ

строка, в которой все значения равны null

если это поможет, я использую MySQL Workbench и intellij

Комментарии:

1. Попробуйте SELECT * FROM hetero.temporary WHERE Cattable IS 'Bodyparts '

2. @Spectric, я ожидал синтаксической ошибки. Используйте = вместо этого.

Ответ №1:

Обратите внимание на введенное вами значение

 ' Bodyparts '
 

В нем есть пробел перед текстом и после него. Когда вы искали, вы искали

 LIKE 'Bodyparts '
 

Обратите внимание на отсутствие начального пробела. Кроме того, поскольку вы не включили никаких подстановочных знаков, оператор эквивалентен

 = 'Bodyparts '
 

так что, конечно, ничего не совпадает. Это сработало бы, если бы вы написали

 LIKE '%Bodyparts%'
 

но не совсем ясно, чего ты хочешь. Решите, действительно ли вам нужны начальные и конечные пробелы.

Кроме того, обратите внимание, что построение инструкции SQL таким образом, как вы это делаете, открыто для атак SQL-инъекций. Вы должны использовать заполнители, как в

 "UPDATE hetero.temporary SET CatTable = ? WHERE CatTable IS NULL"
 

А затем укажите значение во время выполнения, используя подготовленный оператор.

Комментарии:

1. LIKE принимает во внимание конечные пробелы, но = не делает этого.

2. Большое вам спасибо. Я застрял на этом некоторое время