Зачем кому-то использовать 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

307
1

  • * «зачем кому-то использовать эту конструкцию для определения представления» * Вероятно, ...
18
Общее количество ответов: 18

Ответ #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 это не должно повлиять на производительность.

389
12

  • работа с конечными операторами 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

127
2

  • Это должен быть принятый ответ. На самом деле п ...

Ответ #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".

40
0

Ответ #4

Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?

Похоже на ленивый способ всегда знать, что 9X_sqlselect ваше предложение WHERE уже определено, и 9X_sql-statement позволять вам добавлять условия, не проверяя, является 9X_sqlselect ли оно первым.

29
2

  • @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 вы хотите загрузить данные для сравнения)

23
1

  • Забыл добавить, хотя он создаст новую таблицу с теми же данными, что и старая, новая таблица не будет иметь других ограничений, таких как внешний ключ из с ...

Ответ #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

19
0

Ответ #7

Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?

Выражение 1 = 1 обычно используется в сгенерированном 9X_select-statement коде sql. Это выражение может упростить 9X_sql создание кода sql, уменьшив количество условных 9X_sqlselect операторов.

18
0

Ответ #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

12
2

  • @ADTC, я не имел в виду ленивый в плохом смысле. На самом деле, ленивость - это _хорошая_ черта программирования :-) Я поясн ...

Ответ #9

Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?

где 1 = 0, это делается для проверки, существует 9X_sql ли таблица. Не знаю, почему используется 9X_dynamic-sql 1 = 1.

10
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 у вас будет хотя бы одно предложение!

6
1

  • Вот где приходит 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;

6
0

Ответ #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.

5
1

  • На самом деле в этой идее нет ничего «плохого», не говоря уже о «очевидном» недост ...

Ответ #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 деле не является логическим.

5
0

Ответ #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. Я не поклонник синтаксиса

3
0

Ответ #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);

2
0

Ответ #16

Ответ на вопрос: Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?

Увидел это в производственном коде и попросил 9X_sqlselect помощи у пожилых людей.

Их ответ:

-Мы используем 9X_sql 1 = 1, поэтому, когда нам нужно добавить 9X_sql-syntax новое условие, мы можем просто ввести

and 

и продолжай.

2
0

Ответ #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'.

1
0

Ответ #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 при правильном отступе.

1
0