Зачем кому-то использовать WHERE 1 = 1 и <conditions>в предложении SQL? - PullRequest
231 голосов
/ 28 октября 2008

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

Ответы [ 18 ]

4 голосов
/ 17 ноября 2011

Вот тесно связанный пример: использование оператора SQL MERGE для обновления целевой таблицы, используя все значения из исходной таблицы, где нет общего атрибута, к которому можно присоединиться, например.

MERGE INTO Circles
   USING 
      (
        SELECT pi
         FROM Constants
      ) AS SourceTable
   ON 1 = 1
WHEN MATCHED THEN 
  UPDATE
     SET circumference = 2 * SourceTable.pi * radius;
4 голосов
/ 23 декабря 2014

Зачем кому-то использовать ГДЕ 1 = 1 И <proper conditions>

Я видел фреймворки homespun делают такие вещи ( blush ), так как это позволяет применять ленивый анализ как к ключевым словам WHERE, так и AND Sql .

Например (здесь я использую C # в качестве примера), рассмотрим условный анализ следующих предикатов в запросе 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 означает, что специальный код не требуется:

  • Для И - следует ли применять ноль, один или оба предиката (Bars и Baz's), которые будут определять, требуется ли первый AND. Поскольку у нас уже есть хотя бы один предикат с 1 = 1, это означает, что AND всегда в порядке.
  • Без предикатов вообще - в случае, когда есть предикаты ZERO, тогда WHERE должен быть отброшен. Но опять же, мы можем быть ленивыми, потому что мы снова гарантируем хотя бы один предикат.

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

3 голосов
/ 05 апреля 2016

Если вы пришли сюда в поисках WHERE 1, обратите внимание, что WHERE 1 и WHERE 1=1 идентичны. WHERE 1 используется редко, потому что некоторые системы баз данных отвергают его, поскольку WHERE 1 не является логическим.

1 голос
/ 16 марта 2018

Изучив все ответы, я решил провести некоторый эксперимент, например

SELECT
*
FROM MyTable

WHERE 1=1

Тогда я проверил с другими номерами

WHERE 2=2
WHERE 10=10
WHERE 99=99

т.д. Сделав все проверки, запрос запуска город остается прежним. даже без оговорки куда. Я не фанат синтаксиса

1 голос
/ 16 февраля 2018

Это полезно в случае, когда вам нужно использовать динамический запрос, в котором, где Вы должны добавить некоторые параметры фильтра. Например, если вы включите опции 0 для статуса неактивно, 1 для активного. Исходя из опций, есть только две доступные опции (0 и 1), но если вы хотите отобразить Все записи, удобно включить в где close 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);
0 голосов
/ 05 февраля 2009

Я впервые столкнулся с этим с ADO и классическим ASP, ответ я получил: производительность. если вы делаете стрит

Select * from tablename

и передайте, что в виде команды / текста sql вы получите заметное увеличение производительности с

Where 1=1

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

0 голосов
/ 19 марта 2014

Обычно я делаю это, когда создаю динамический SQL для отчета, который имеет много раскрывающихся значений, которые может выбрать пользователь. Так как пользователь может или не может выбирать значения из каждого раскрывающегося списка, нам в конечном итоге трудно выяснить, какое условие было первым предложением where. Поэтому мы дополняем запрос символом where 1=1 в конце и добавляем все операторы where после этого.

Что-то вроде

select column1, column2 from my table where 1=1 {name} {age};

Затем мы построим предложение where, как это, и передадим его в качестве значения параметра

string name_whereClause= ddlName.SelectedIndex > 0 ? "AND name ='"+ ddlName.SelectedValue+ "'" : "";

Поскольку выбор условия where нам неизвестен во время выполнения, это очень помогает нам найти, стоит ли включать 'AND' or 'WHERE'.

0 голосов
/ 10 августа 2012

Использование предиката, подобного 1=1, является обычной подсказкой, иногда используемой, чтобы заставить план доступа использовать или не использовать сканирование индекса. Причина, по которой это используется, заключается в том, что вы используете многоплановый объединенный запрос со многими предикатами в предложении where, где иногда даже использование всех индексов заставляет план доступа читать каждую таблицу - полное сканирование таблицы. Это всего лишь один из многих советов, используемых администраторами баз данных для того, чтобы обманным путем использовать более эффективный путь. Только не бросай одну; вам нужен dba для анализа запроса, так как он не всегда работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...