Зачем кому-то ставить `где 1 = 1` в запросе?

18

Сегодня я наткнулся на представление в нашей базе данных, где было первое утверждение в предложении where where 1 = 1. Разве это не должно возвращать истину для каждой записи? Зачем кому-то писать это, если он не фильтрует записи?

goric
источник
3
Потому что они хотят взломать сайт sombodys ;-)
Тим Шмельтер

Ответы:

40

Некоторые динамические компоновщики запросов включают это условие, так что любые «реальные» условия могут быть добавлены ANDбез проверки, как if (first condition) 'WHERE' else 'AND'.

BENV
источник
Звучит странно, что построитель запросов не может определить, является ли условие первым в строке, но я также думаю, что вы правы.
ern0
3
часто бывает так, что «построитель запросов» - это кто-то, пишущий код для конкатенации в оператор SQL вручную. иногда введение более формальной библиотеки построения запросов устраняет ее.
Аракнид
1
Мне приходилось иметь дело со «старым» кодом, как это, и это очень верно. Когда вы собираете весь SQL-оператор в единую строку, будут наборы операторов if / then или case, которые могут запускаться или не запускаться. Поскольку вы никогда не знаете, взяты ли какие-либо из этих путей кода, НО у вас есть AND, встроенный в ваше предложение WHERE (из-за предложения, которое последовательно является частью строки), вам нужно либо (a) удалить ошибочное AND, либо ( б) просто передайте это логический трюизм. Добавить «1 = 1» проще, чем правильно редактировать строку.
Эйвери Пейн
5

Если в вашей программе есть много точек построения операторов SQL, которые генерируют похожие запросы, вы можете пометить проверенный запрос этим трюком. Если предложение касается подсчета, вы можете использовать приведенный ниже код, чтобы вы могли извлечь 42из журнала SQL.

select count(42) from table
ern0
источник
4

Это обеспечивает ситуацию, которая всегда верна, поэтому она не влияет на результаты, но вы знаете, что в предложении WHERE уже есть один элемент.

Schwartze
источник