Зачем кому-то использовать WHERE 1=1 AND <conditions>
в предложении SQL (либо SQL, полученный через объединенные строки, либо посмотреть определение)
Я где-то видел, что это будет использоваться для защиты от SQL-инъекций, но это кажется очень странным.
Если есть инъекция WHERE 1 = 1 AND injected OR 1=1
будет иметь тот же результат, что и injected OR 1=1
.
Позднее редактирование: как насчет использования в определении представления?
Спасибо за ваши ответы.
Тем не менее, я не понимаю, почему кто-то использует эту конструкцию для определения представления или использует ее внутри хранимой процедуры.
Возьмите это к примеру:
CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value
sql
dynamic-sql
Богдан Максим
источник
источник
Ответы:
Если список условий неизвестен во время компиляции и вместо этого создается во время выполнения, вам не нужно беспокоиться о наличии одного или нескольких условий. Вы можете генерировать их все как:
и объединить их всех вместе. С самого
1=1
начала у инициалаand
есть что связать.Я никогда не видел, чтобы это использовалось для какой-либо защиты от инъекций, так как вы говорите, что это не очень помогает. Я уже видел , как это используется в качестве удобства реализации. Механизм SQL-запросов в конечном итоге будет игнорировать,
1=1
поэтому он не должен влиять на производительность.источник
where 1=1
(Oracle) илиwhere true
(Postgres), мне придется проверять для каждого условия, является ли оно первым. В этом нет никакого смысла, и это только добавляет больше стандартного кода.Просто добавьте пример кода в ответ Грега:
источник
Я видел, как это используется, когда число условий может быть переменным.
Вы можете объединить условия, используя строку «И». Затем, вместо подсчета количества условий, которые вы передаете, вы помещаете «WHERE 1 = 1» в конец вашего оператора SQL и добавляете объединенные условия.
По сути, это избавляет вас от необходимости проверять условия и затем добавлять строку «ГДЕ» перед ними.
источник
Похоже, ленивый способ всегда знать, что ваше предложение WHERE уже определено и позволяет вам продолжать добавлять условия, не проверяя, является ли оно первым.
источник
where 1=1
(Oracle) илиwhere true
(Postgres), мне придется проверять для каждого условия, является ли оно первым. В этом нет никакого смысла, и это только добавляет больше стандартного кода.WHERE 1=1
это дополнительная работа по поддержанию одного и того же кода в нескольких местах и чтению его во всех ваших сгенерированных SQL. Я ленивее тебя, я думаю!Косвенно релевантно: когда используется 1 = 2:
это создаст новую таблицу с той же схемой, что и старая таблица. (Очень удобно, если вы хотите загрузить некоторые данные для сравнения)
источник
1 = 1 выражение обычно используется в сгенерированном коде sql. Это выражение может упростить создание кода SQL, уменьшая количество условных операторов.
источник
На самом деле, я видел подобные вещи, используемые в отчетах BIRT. Запрос, передаваемый в среду выполнения BIRT, имеет форму:
и "?" во время выполнения заменяется фактическим значением параметра, выбранным из раскрывающегося списка. Выбор в раскрывающемся списке:
так что вы получите все возможные значения плюс "
*
". Если пользователь выбирает «*
» из выпадающего списка (то есть должны быть выбраны все значения a), запрос должен быть изменен (с помощью Javascript) перед выполнением.Так как "?" является позиционным параметром, и ДОЛЖЕН оставаться там, чтобы другие вещи работали, Javascript изменяет запрос так:
Это в основном устраняет эффект предложения where, оставляя позиционный параметр на месте.
Я также видел случай AND, используемый ленивыми кодировщиками при динамическом создании SQL-запроса.
Допустим, вам нужно динамически создать запрос, который начинается с
select * from t
проверки:некоторые люди добавили бы первое с ГДЕ, а последующие с И, таким образом:
Ленивые программисты (и это не обязательно плохая черта) не будут различать добавленные условия, они начнут с
select * from t where 1=1
и просто добавят предложения AND после этого.источник
where 1=1
(Oracle) илиwhere true
(Postgres), мне придется проверять для каждого условия, является ли оно первым. В этом нет никакого смысла, и это только добавляет больше стандартного кода.Я нашел полезным этот шаблон, когда я тестирую или проверяю объекты в базе данных, поэтому я могу очень быстро прокомментировать другие условия:
превращается в:
источник
где 1 = 0, это делается для проверки существования таблицы. Не знаю, почему используется 1 = 1.
источник
Хотя я вижу, что 1 = 1 было бы полезно для сгенерированного SQL, в PHP я использую технику для создания массива предложений, а затем
таким образом избегая проблемы наличия ведущего или конечного И. Очевидно, это полезно, только если вы знаете, что у вас будет хотя бы одно предложение!
источник
Вот тесно связанный пример: использование оператора SQL
MERGE
для обновления целевой таблицы с использованием всех значений из исходной таблицы, где нет общего атрибута, к которому можно присоединиться, например,источник
Я видел, как фреймворки homespun делают такие вещи ( blush ), поскольку это позволяет применять ленивые методы парсинга к ключевым словам
WHERE
иAND
Sql.Например (здесь я использую C # в качестве примера), рассмотрим условный анализ следующих предикатов в запросе Sql
string builder
:«Преимущество»
WHERE 1 = 1
означает, что никакого специального кода не требуется:AND
требуется ли первый . Поскольку у нас уже есть хотя бы один предикат с1 = 1
, это означает,AND
что все в порядке.WHERE
должен быть отброшен. Но опять же, мы можем быть ленивыми, потому что мы снова гарантируем хотя бы один предикат.Очевидно, что это плохая идея, и мы рекомендуем использовать установленную среду доступа к данным или ORM для синтаксического анализа необязательных и условных предикатов таким образом.
источник
WHERE 1=1
является справедливым показателем того, что это НЕ тот случай, что кодовая база завалена битами строкWHERE 1=1
, что указывало бы на проблему с архитектурой приложения, и я думаю, не единственная!Если вы пришли сюда в поисках
WHERE 1
, обратите внимание, чтоWHERE 1
иWHERE 1=1
они идентичны.WHERE 1
используется редко, потому что некоторые системы баз данных отклоняют его, считая, что онWHERE 1
не является логическим.источник
Это полезно в случае, когда вам нужно использовать динамический запрос, в котором в предложении where вы должны добавить некоторые параметры фильтра. Например, если вы включите опции 0 для статуса неактивно, 1 для активного. Исходя из опций, есть только две доступные опции (0 и 1), но если вы хотите отобразить все записи, удобно включить туда, где close 1 = 1. Смотрите ниже образец:
источник
Изучив все ответы, я решил провести такой эксперимент, как
Тогда я проверил с другими номерами
т. е. выполнив все проверки, запрос run town остается прежним. даже без оговорки куда. Я не фанат синтаксиса
источник
Я делаю это обычно, когда создаю динамический SQL для отчета, который имеет много выпадающих значений, которые пользователь может выбрать. Так как пользователь может или не может выбирать значения из каждого раскрывающегося списка, нам в конечном итоге трудно понять, какое условие было первым предложением where. Таким образом, мы дополняем запрос символом «
where 1=1
в конце» и добавляем все предложения where после этого.Что-то вроде
Затем мы построим предложение where, как это, и передадим его в качестве значения параметра.
Поскольку выбор условия where нам неизвестен во время выполнения, это очень помогает нам найти, включать ли
'AND' or 'WHERE'.
источник
Использование подобного предиката
1=1
является обычной подсказкой, иногда используемой, чтобы заставить план доступа использовать или не использовать сканирование индекса. Причина, по которой это используется, заключается в том, что вы используете многостраничный объединенный запрос со многими предикатами в предложении where, где иногда даже использование всех индексов заставляет план доступа читать каждую таблицу - полное сканирование таблицы. Это всего лишь один из многих советов, используемых администраторами баз данных, чтобы обманным путем заставить использовать более эффективный путь. Только не бросай одну; вам нужен dba для анализа запроса, так как он не всегда работает.источник
Вот пример использования ... однако меня не слишком волнуют технические аспекты того, почему я должен или не должен использовать 1 = 1. Я пишу функцию, использующую pyodbc для получения некоторых данных из SQL Server. Я искал способ заставить наполнитель после
where
ключевого слова в моем коде. Это было действительно отличное предложение:Причина в том, что я не смог реализовать ключевое слово 'where' вместе внутри переменной предложения _where. Итак, я думаю, что использование любого фиктивного условия, которое оценивается как истинное, подойдет в качестве наполнителя.
источник
Впервые я столкнулся с этим с ADO и классическим ASP, ответ я получил: производительность. если вы делаете прямой
Select * from tablename
и передать, что в качестве команды / текста SQL вы получите заметное увеличение производительности с
Where 1=1
добавил, это была видимая разница. что-то связанное с возвращением заголовков таблицы, как только будет выполнено первое условие, или какое-то другое безумие, в любом случае, это ускорило процесс.
источник