Зачем использовать WHERE 1 или WHERE 1 = 1?


50

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

  • Почему это сделано?
  • Есть ли конкретные преимущества для времени выполнения?
  • Включает ли это другие функции?
  • Использует ли WHERE 1=1подобное подобное?

Ответы:


45

В основном это просто для удобства программиста, так как вы можете просто добавить дополнительные условия AND...после этого, и это не повлияет на время выполнения.

Проверьте эти ссылки на Stackoverflow:

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


16

Мое основное использование заключается в том, что это облегчает комментирование материала при разработке запросов. Я веду с ,'s и and' s:

SELECT
     A
--  ,B
    ,C
    ,D
--  ,E
FROM TABLE
WHERE 1=1
--  and B='This'
    and C='That'
--  and D is not null

Также облегчает программную привязку до конца.

this  = "SELECT * "
this += "FROM TABLE "
this += "WHERE 1=1 "
if user chooses option a then this += "and A is not null "
if user chooses option b then this += "and B is not null "
if user chooses option b then this += "and C is not null "
if user chooses option b then this += "and D is not null "

В противном случае вам нужно будет квалифицировать первый вариант ... и каждый следующий параметр проверяет предыдущие параметры. Что если пользователь выбрал только вариант D в предыдущем примере? Вы должны убедиться, что if A, B and C aren't chosenзатем использовать WHEREдругое использование and. С =самого начала вы можете просто добавить классификаторы к концу оператора.


1
И вы написали этот код наподобие 1980 на языке без объектной ориентации, до того, как кто-нибудь придумал идею объектного генератора SQL?
TomTom

Я пишу codeаналогично первому блоку в SSMS или аналогичным инструментам запросов. Изучение наборов данных и получение правильных результатов до того, как они попадут в инструменты отчетности (например, Crystal Reports) для конечных пользователей. Второй блок - это то, что, как я видел, делают другие люди, так как моя работа была не слишком связана с необработанным доступом SQL. Я помогаю другим людям в поиске подобных кодов и могу понять причину. (Код был на VB, C # и PHP).
WernerCD

10

Почему мы так делаем?

Мне приходит в голову динамическая генерация кода, написанная не слишком компетентными программистами.

Генерирует SELECT .... WHERE, а затем вам нужно иметь что-то .... поэтому вместо добавления WHERE только при необходимости они добавляют неограничивающие условия, когда их нет. Видно, что - ответственный за увольнение «специалист».

Или у парня просто вещи ГДЕ обязательны;)

Что-то еще я не вижу.


5

Я программировал набор пользовательских функций на C ++ / C для PostgreSQL, которые использовались другими людьми в большой компании (более 10 тысяч человек). Мои функции имеют необязательный whereпараметр: если значение не указано, предложение не используется. Это было явно задокументировано. К сожалению, никто не использовал эту функцию, и все, кто просто поставил where 1=1предложение. Теоретически это кажется неразумным, практически все оптимизаторы запросов исключают подобные утверждения. И трудно обучать 10 тысяч человек.


3
Никто никогда не звонил в твой UDF WHERE 1=1; DROP TABLE CUSTOMERS?
Мерцает

Тем не менее, я не могу найти концепции использования пункта 1. Нужно больше разъяснений? Поскольку я не получил никакого улучшения во времени выполнения.
Ursitesion

Это мало влияет на время выполнения. Это связано с культурой, которую программируют люди. Иногда бывает, что ваш код (программируемый ИТ-специалистами) используется инженерами. У этих ребят есть свой способ думать и вызывать твой код
Артур

@ Twinkles: это определенно интересная проблема. Здесь следует отметить несколько моментов. (i) база данных доступна только для UDF (ii) Моя функция объединяет несколько групп таблиц с помощью множества вещей и, что еще хуже, использует оконные функции хранилища данных. Это усложняет отбрасывание чего-либо, хотя и не невозможно, (iii) UDF предназначены для предсерийного кода. Это означает, что она никогда не запускается в производство: если функция выдерживает испытание, другой отдел полностью переписывает все, что мы запрограммировали
Артур

4
На самом деле довольно легко обучить 10000 человек. Заставьте приложение потерпеть неудачу, когда они делают это неправильно. Они немедленно прекратят делать это неправильно.
Жасмин

2

Использование «где 1 = 1» уменьшает сложность кода, необходимого для динамического создания предложения sql 'where'. В противном случае при создании предложения where вам нужно будет проверить, является ли это первым компонентом для каждого добавленного компонента. Это простой кодовый шаблон, позволяющий снизить сложность кода и, по возможности, уменьшить сложность кода - это почти всегда правильное решение.


0

Здесь вы идете ... с точки зрения программирования одно использование 1 = 1 ...введите описание изображения здесь

В такой ситуации, когда мне нужно построить запрос во время выполнения, и он может быть коротким или длинным, я использую «где 1 = 1 И»

string criteria =string.Empty;
        if (txtc1.Text != "")
        {
            criteria += "criteria1=" + "'" + txtc1.Text + "' ";
        }
        if (txtc2.Text != "")
        {
            criteria += "OR criteria2=" + "'" + txtc2.Text + "' ";
        }
        if (ddl1.SelectedItem.Text != "")
        {
            criteria += "OR criteria3=" + "'" + ddl1.SelectedItem.Text + "' ";
        } if (ddl2.SelectedItem.Text != "")
        {
            criteria += "OR criteria4=" + "'" + ddl2.SelectedItem.Text + "' ";
        }
        if (ddl3.SelectedItem.Text != "")
        {
            criteria += "OR criteria5=" + "'" + ddl3.SelectedItem.Text + "' ";
        }
        if (ddl4.SelectedItem.Text != "")
        {
            criteria += "OR criteria6=" + "'" + ddl4.SelectedItem.Text + "' ";

        } 
        if (txtc1.Text == "")  
        {
            //criteria = criteria.Substring(2);
            criteria = criteria.Substring(2,criteria.Length-3);
        }
        if (criteria != string.Empty)
        {
            criteria = "where 1=1 AND " + criteria;
            //Response.Write("<script>alert('query constructed by you is : '+'" +criteria+ "');</script>");
            Response.Write(criteria);
        }

Сделать вещи проще

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.