Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Зачем кому-то использовать WHERE 1=1 AND
в предложении 9X_dynamic-sql SQL (либо SQL, полученный через конкатенированные 9X_sql-syntax строки, либо определение представления)
Я 9X_dynamic-sql где-то видел, что это может использоваться 9X_sql-syntax для защиты от SQL-инъекций, но это кажется 9X_sql очень странным.
Если есть инъекция, WHERE 1 = 1 AND injected OR 1=1
будет 9X_sql-syntax иметь тот же результат, что и injected OR 1=1
.
Позднее редактирование: как 9X_sql-syntax насчет использования в определении представления?
Спасибо 9X_dynamic-sql за ответы.
Тем не менее, Я не понимаю, зачем 9X_dynamic-sql кому-то использовать эту конструкцию для 9X_sql определения представления или использовать 9X_sql ее внутри хранимой процедуры.
Возьмем, к 9X_sql примеру, следующее:
CREATE VIEW vTest AS SELECT FROM Table WHERE 1=1 AND table.Field=Value
- * «зачем кому-то использовать эту конструкцию для определения представления» * Вероятно, ...
Ответ #1
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Если список условий неизвестен во время 9X_sql-query компиляции и вместо этого создается во время 9X_sql-statement выполнения, вам не нужно беспокоиться о 9X_sql-query том, есть ли у вас одно или несколько условий. Вы 9X_select-statement можете сгенерировать их все, например:
and
и 9X_sql объедините их все вместе. С 1=1
в начале, у 9X_sql-query исходного and
есть что связать.
Я никогда не 9X_dynamic-sql видел, чтобы это использовалось для какой-либо 9X_sql защиты от инъекций, как вы говорите, это 9X_sql-query вряд ли поможет. Я видел, что это используется 9X_sql для удобства реализации. Механизм запросов 9X_sqlselect SQL в конечном итоге проигнорирует 1=1
, поэтому 9X_sql-statement это не должно повлиять на производительность.
- работа с конечными операторами AND или COMMA не является грязной ... нет ничего более чи ...
Ответ #2
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Просто добавляю пример кода к ответу Грега:
dim sqlstmt as new StringBuilder sqlstmt.add("SELECT * FROM Products") sqlstmt.add(" WHERE 1=1") ''// From now on you don't have to worry if you must ''// append AND or WHERE because you know the WHERE is there If ProductCategoryID <> 0 then sqlstmt.AppendFormat(" AND ProductCategoryID = {0}", trim(ProductCategoryID)) end if If MinimunPrice > 0 then sqlstmt.AppendFormat(" AND Price >= {0}", trim(MinimunPrice)) end if
9X_sql-select
- Это должен быть принятый ответ. На самом деле п ...
Ответ #3
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Я видел, как он используется, когда количество 9X_dynamic-sql условий может быть переменным.
Вы можете 9X_sql-syntax объединить условия, используя строку «И». Затем 9X_sql-statement вместо подсчета количества проходящих условий 9X_sql вы помещаете «WHERE 1 = 1» в конец стандартного 9X_sql-query оператора SQL и добавляете конкатенированные 9X_sql-select условия.
По сути, это избавляет вас от необходимости 9X_sql-statement выполнять проверку условий и затем добавлять 9X_sql-select перед ними строку "WHERE".
Ответ #4
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Похоже на ленивый способ всегда знать, что 9X_sqlselect ваше предложение WHERE уже определено, и 9X_sql-statement позволять вам добавлять условия, не проверяя, является 9X_sqlselect ли оно первым.
- @ADTC Написание кода часто - если не в основном - связано с обработкой различных условий. Это всего лишь еще одно условие, которое необходимо ...
Ответ #5
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Косвенно релевантно: когда используется 9X_sql-select 1 = 2:
CREATE TABLE New_table_name as select * FROM Old_table_name WHERE 1 = 2;
это создаст новую таблицу с той же 9X_select-statement схемой, что и старая таблица. (Очень удобно, если 9X_sql-statement вы хотите загрузить данные для сравнения)
- Забыл добавить, хотя он создаст новую таблицу с теми же данными, что и старая, новая таблица не будет иметь других ограничений, таких как внешний ключ из с ...
Ответ #6
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Я нашел этот шаблон полезным, когда я тестирую 9X_dynamic-sql или дважды проверяю что-то в базе данных, поэтому 9X_sqlselect я могу очень быстро прокомментировать другие 9X_sql-syntax условия:
CREATE VIEW vTest AS SELECT FROM Table WHERE 1=1 AND Table.Field=Value AND Table.IsValid=true
превращается в:
CREATE VIEW vTest AS SELECT FROM Table WHERE 1=1 --AND Table.Field=Value --AND Table.IsValid=true
Ответ #7
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Выражение 1 = 1 обычно используется в сгенерированном 9X_select-statement коде sql. Это выражение может упростить 9X_sql создание кода sql, уменьшив количество условных 9X_sqlselect операторов.
Ответ #8
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
На самом деле, я видел подобное в отчетах 9X_sql BIRT. Запрос, передаваемый среде выполнения 9X_select-statement BIRT, имеет следующий вид:
select a,b,c from t where a = ?
и '?' заменяется 9X_sql-query во время выполнения фактическим значением 9X_select-statement параметра, выбранным из раскрывающегося 9X_sql-select списка. Варианты в раскрывающемся списке 9X_sqlselect даются:
select distinct a from t union all select '*' from sysibm.sysdummy1
чтобы получить все возможные значения 9X_sql-statement плюс "*
". Если пользователь выбирает «*
» в 9X_sql-query раскрывающемся списке (это означает, что 9X_sql-syntax должны быть выбраны все значения a), запрос 9X_sql-statement должен быть изменен (с помощью Javascript) перед 9X_sql-statement запуском.
Так как "?" является позиционным 9X_dynamic-sql параметром и ДОЛЖЕН оставаться там, чтобы 9X_sql-statement другие вещи работали, Javascript изменяет 9X_sql запрос следующим образом:
select a,b,c from t where ((a = ?) or (1==1))
Это в основном 9X_sql-select устраняет эффект предложения where, оставляя 9X_sqlselect позиционный параметр на месте.
Я также видел 9X_sql-select случай AND, используемый ленивыми программистами 9X_sql-select при динамическом создании SQL-запроса.
Допустим, вам 9X_select-statement нужно динамически создать запрос, который 9X_sql начинается с select * from t
и проверяет:
- зовут Боб; и
- зарплата > $20,000
некоторые люди 9X_sql-statement добавляли бы первый с помощью WHERE, а последующие 9X_sql с помощью AND, таким образом:
select * from t where name = 'Bob' and salary > 20000
Ленивые программисты 9X_sql (и это не обязательно плохая черта) не различают 9X_sql-statement добавленные условия, они начинают с select * from t where 1=1
и только 9X_sql-query после этого добавляют предложения AND.
select * from t where 1=1 and name = 'Bob' and salary > 20000
- @ADTC, я не имел в виду ленивый в плохом смысле. На самом деле, ленивость - это _хорошая_ черта программирования :-) Я поясн ...
Ответ #9
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
где 1 = 0, это делается для проверки, существует 9X_sql ли таблица. Не знаю, почему используется 9X_dynamic-sql 1 = 1.
- Видно, что это используется для возврата пустого набора результат ...
Ответ #10
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Хотя я вижу, что 1 = 1 было бы полезно для 9X_sql-query сгенерированного SQL, метод, который я использую 9X_select-statement в PHP, - это создать массив предложений, а 9X_sql-query затем выполнить
implode (" AND ", $clauses);
, таким образом избегая проблемы 9X_sql-query наличия начального или конечного AND. Очевидно, это 9X_sql полезно только в том случае, если вы знаете, что 9X_sql-query у вас будет хотя бы одно предложение!
- Вот где приходит 1 = 1. Это дает вам "по крайней мере одно предложение", поэтому вам не нужно беспокоиться о том, чтобы просто нажать "AND a ...
Ответ #11
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Вот близкий пример: использование оператора 9X_sql-query SQL MERGE
для обновления целевой таблицы с использованием 9X_sql-statement всех значений из исходной таблицы, где нет 9X_sql-select общего атрибута, к которому можно было бы 9X_sql-statement присоединиться, например
MERGE INTO Circles USING ( SELECT pi FROM Constants ) AS SourceTable ON 1 = 1 WHEN MATCHED THEN UPDATE SET circumference = 2 * SourceTable.pi * radius;
Ответ #12
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Зачем кому-то использовать WHERE 1 = 1 И 9X_sql
У меня seen самодельные фреймворки делают такие 9X_sql-syntax вещи (blush), поскольку это позволяет применять 9X_sql-syntax методы ленивого синтаксического анализа 9X_sql-select как к ключевым словам
WHERE
, так иAND
Sql.Например 9X_sql-statement (здесь я использую C# в качестве примера), рассмотрите 9X_sql-syntax условный синтаксический анализ следующих 9X_sql-syntax предикатов в запросе Sql
string builder
:var sqlQuery = "SELECT * FROM FOOS WHERE 1 = 1" if (shouldFilterForBars) { sqlQuery = sqlQuery + " AND Bars > 3"; } if (shouldFilterForBaz) { sqlQuery = sqlQuery + " AND Baz < 12"; }
"Преимущество"
WHERE 1 = 1
означает 9X_dynamic-sql отсутствие необходимости в специальном коде:
- Для И - следует ли применять ноль, один или оба предиката (Bars и Baz), которые будут определять, требуется ли первый
AND
. Поскольку у нас уже есть хотя бы один предикат с1 = 1
, это означает, чтоAND
всегда в порядке.- Без предикатов вообще - в случае, если предикатов НУЛЯ, необходимо отбросить
WHERE
. Но опять же, мы можем лениться, потому что мы снова гарантируем хотя бы один предикат.Очевидно, что 9X_sql-select это плохая идея, и для подобного анализа 9X_sql-syntax необязательных и условных предикатов рекомендуется 9X_dynamic-sql использовать установленную структуру доступа 9X_sql-select к данным или ORM.
- На самом деле в этой идее нет ничего «плохого», не говоря уже о «очевидном» недост ...
Ответ #13
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Если вы пришли сюда в поисках WHERE 1
, обратите 9X_sql внимание, что WHERE 1
и WHERE 1=1
идентичны. WHERE 1
используется 9X_sql редко, потому что некоторые системы баз 9X_sql-query данных отклоняют его, считая, что WHERE 1
на самом 9X_sqlselect деле не является логическим.
Ответ #14
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Просмотрев все ответы, я решил провести 9X_sqlselect эксперимент вроде
SELECT * FROM MyTable WHERE 1=1
Затем я проверил другие 9X_sql цифры
WHERE 2=2 WHERE 10=10 WHERE 99=99
и т. д. После выполнения всех проверок 9X_sql-syntax город выполнения запроса останется прежним. даже 9X_sql-statement без предложения where. Я не поклонник синтаксиса
Ответ #15
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Это полезно в случае, когда вам нужно использовать 9X_select-statement динамический запрос, в котором где предложение 9X_sql-syntax вам необходимо добавить некоторые параметры 9X_sql-statement фильтра. Например, если вы включите параметры, 0 9X_sql-select для статуса неактивен, 1 для активного. Исходя 9X_sql-select из параметров, есть только два доступных 9X_sql-statement варианта (0 и 1), но если вы хотите отобразить 9X_dynamic-sql все записи, удобно включить его, где close 9X_sql-query 1 = 1. См. Образец ниже:
Declare @SearchValue varchar(8) Declare @SQLQuery varchar(max) = ' Select [FirstName] ,[LastName] ,[MiddleName] ,[BirthDate] ,Case when [Status] = 0 then ''Inactive'' when [Status] = 1 then ''Active'' end as [Status]' Declare @SearchOption nvarchar(100) If (@SearchValue = 'Active') Begin Set @SearchOption = ' Where a.[Status] = 1' End If (@SearchValue = 'Inactive') Begin Set @SearchOption = ' Where a.[Status] = 0' End If (@SearchValue = 'All') Begin Set @SearchOption = ' Where 1=1' End Set @SQLQuery = @SQLQuery + @SearchOption Exec(@SQLQuery);
Ответ #16
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Увидел это в производственном коде и попросил 9X_sqlselect помощи у пожилых людей.
Их ответ:
-Мы используем 9X_sql 1 = 1, поэтому, когда нам нужно добавить 9X_sql-syntax новое условие, мы можем просто ввести
and
и продолжай.
Ответ #17
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Обычно я делаю это, когда создаю динамический 9X_sql-statement SQL для отчета, в котором есть много раскрывающихся 9X_sqlselect значений, которые может выбрать пользователь. Поскольку 9X_sql пользователь может или не может выбирать 9X_sql-select значения из каждого раскрывающегося списка, нам 9X_sql-syntax сложно определить, какое условие было первым 9X_sqlselect предложением where. Поэтому мы дополняем 9X_sql запрос where 1=1
в конце и добавляем все предложения 9X_sql-statement where после этого.
Что-то вроде
select column1, column2 from my table where 1=1 {name} {age};
Затем мы создадим 9X_dynamic-sql предложение where, подобное этому, и передадим 9X_sqlselect его в качестве значения параметра
string name_whereClause= ddlName.SelectedIndex > 0 ? "AND name ='"+ ddlName.SelectedValue+ "'" : "";
Поскольку 9X_sql выбор предложения where неизвестен нам во 9X_sql время выполнения, это очень помогает нам 9X_sqlselect в определении того, следует ли включать 9X_sql-statement 'AND' or 'WHERE'.
Ответ #18
Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Создание "where 1 = 1" стандартом для всех 9X_dynamic-sql ваших запросов также упрощает проверку sql 9X_sql-select путем замены его на where 1 = 0, что удобно, когда 9X_sql-query у вас есть пакеты команд / файлов.
Также 9X_dynamic-sql упрощает поиск конца раздела "from / join" в 9X_sql любом запросе. Даже запросы с подзапросами 9X_sqlselect при правильном отступе.
-
16
-
3
-
5
-
2
-
2
-
6
-
5
-
4
-
4
-
7
-
7
-
1
-
9
-
2
-
13
-
4
-
3
-
1
-
1
-
4
-
3
-
1
-
3
-
2
-
1
-
3
-
1
-
2
-
1
-
4
-
15
-
6
-
8
-
7
-
6
-
12
-
5
-
7
-
2
-
2
-
7
-
7
-
3
-
2
-
4
-
4
-
3
-
3
-
1
-
4