Может ли кто-нибудь помочь мне понять или опубликовать какие-либо идеи по поводу этого предложения?
sql was here
Я изменил имя таблицы, но кроме этого, любая идея, что разработчик пытался сделать здесь?
После этого нет ничего, что предложение where.
Если (table.date_field = (select max(table2.exit_date) from table as table2))
равно null, он вернет 1=1
, что в основном означает отсутствие предложения where.
Теперь посмотрим на это неприятное выражение. Я могу только предположить, что если "a = b" не является истинным, то это также эквивалентно null, иначе похоже, что первая ветвь всегда будет иметь место. Похоже, он пытается сказать "если последняя дата выхода равна дате поля, выберите те, в противном случае нет предложения where". Однако я не думаю, что это будет работать вообще. Это действительно выглядит в любом случае, каждая строка будет выбрана.
"a = b" is not true then that's also equivalent to null
: a = b возвращает NULL, если A или B имеют значение NULL. Если a = b
ложно, он возвращает 0, который не совпадает с NULL.
false
, строка не возвращается. Если она возвращает либо true
или NULL
, он возвращает строку.
MySQL нестандартен тем, что true действительно равен числовому значению 1. Любое выражение, которое оценивает значение true или любое ненулевое значение, удовлетворяет условию.
mysql> CREATE TABLE foo AS SELECT 1=1 AS f;
mysql> SHOW CREATE TABLE foo;
CREATE TABLE `foo` (
`f` INT NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1
Итак, следующее предложение WHERE является законным в MySQL, но не в большинстве других баз данных SQL:
... WHERE 1;
Некоторые люди используют 1=1
как условие-заполнителя, означающее true, но поместить его в строку бессмысленно, поскольку выражения SQL не имеют эквивалента функции eval()
, как это делают другие языки. В этом случае ведущий символ 1 в строке неявно приводится к числовому значению 1, который интерпретируется как истинный в MySQL. Поэтому он, вероятно, работает так, как предполагалось, но случайно.
Использование IFNULL()
заключается в том, что если значение date_field
или MAX(exit_date)
равно NULL, оно возвращает строку. Если вы не использовали эту функцию, то value = NULL будет оцениваться как неизвестное, что означает, что строка не будет возвращена.
Мне кажется, что он пытается найти строку, где table.date_field
равна максимальному значению table.exit_data
. Существует проверка нулевого значения, которое, как я думаю, произойдет в любом из этих случаев:
table
пустtable
имеют exit_data
для NULL
table.date_field
NULL
для рассматриваемой строкиВ любом из этих трех случаев строка будет возвращена. Я не понимаю, почему он использует строку '1=1'
вместо, чтобы привести несколько примеров: 1=1
, 1
или true
, но он работает нормально. В первом случае я предполагаю, что в результирующем наборе не будет никаких строк (в зависимости от остальной части запроса), поэтому он, вероятно, пытался справиться с одним из двух других случаев - я бы предпочел последний.
Это только объяснение того, что происходит. Чтобы понять, почему он это делает, это поможет, если вы дадите немного больше контекста.
Функция MySQL ifnull
возвращает первый аргумент, если он не является нулевым, иначе второй аргумент. Похоже, что он пытается сопоставить table.date_field с max (table2.exit_date) и возвращать true, если комминик не был возможен из-за нулей.
В нем говорится, что если table.date_field = максимальная дата выхода или если max exit_date имеет значение null или table.date_field равно null, возвращайте true. Вернет false, если max exit_date не равен null, а table.date_field не является нулевым, но они не равны.