Навіщо використовувати WHERE 1 або WHERE 1 = 1?


50

Зазвичай, якщо в наших заявах запитів не вимагаються умови, ми не використовуємо WHEREпункт. Але я бачу, що WHERE 1застереження використовується в багатьох місцях, навіть коли інших умов немає.

  • Чому це робиться?
  • Чи є конкретні переваги до часу виконання?
  • Чи це дозволяє інші функції?
  • Чи використання WHERE 1=1подібне до цього?

Відповіді:


42

В основному це просто для зручності програміста, оскільки ви можете просто додати додаткові умови AND...після цього, і це не впливає на час виконання.

Перевірте ці посилання на Stackoverflow:

Зверніть увагу, що WHERE 1ідентично WHERE 1=1; обидва означають, WHERE TRUEале перша система управління базами даних відхиляє першу, оскільки вона не є булевою.


15

Моє основне використання полягає в тому, що це полегшує коментування матеріалів під час розробки запитів. Я веду з ,'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
Ніхто ніколи не дзвонив у ваш АДС WHERE 1=1; DROP TABLE CUSTOMERS?
Мерехтіння

Проте я не в змозі знайти поняття, що стоять за допомогою пункту Where 1. Потрібно більше роз'яснень? Так як я не отримав жодного покращення часу виконання.
Ursitesion

Це мало часу з часом виконання. У ньому є культура, як люди програмують. Інколи трапляється, що ваш код (запрограмований ІТ-людьми) інженерами використовується. У цих хлопців є свій спосіб мислити і викликати свій код
Артур

@Twinkles: це, безумовно, цікаве питання. Тут слід зазначити кілька моментів. (i) база даних читається лише для UDF (ii) Моя функція приєднується до декількох груп таблиць купою речей і для того, щоб гірше використовувати функції вікна зберігання даних. Це робить проблемою скинути що-небудь, хоча і не неможливо; (iii) АДС призначені для попереднього виробництва коду. Що означає, що він ніколи не потрапляє у виробництво: якщо функція переживе виклик, інший відділ повністю переписує все, що ми запрограмували
Артур

4
Насправді виховувати 10 000 людей досить просто. Зробити програму невдалою, коли вони роблять неправильно. Вони негайно перестануть робити це неправильно.
Жасмін

2

Використання "де 1 = 1" зменшує складність коду, необхідного в динамічному sql '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.