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의 :

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다음 WHEREelse use을 사용해야 and합니다. 로 =시작시, 당신은 단지 문장의 끝으로 예선을 때리고 있습니다.


1
그리고 객체 지향이없는 언어로 1980 년과 같은 코드를 작성했습니다. 왜냐하면 누구나 객체 기반 SQL 생성기의 아이디어를 생각해 냈습니까?
TomTom

codeSSMS 또는 유사한 쿼리 도구의 첫 번째 블록과 유사하게 작성 합니다. 최종 사용자를 위해 Crystal Reports와 같은보고 도구에 넣기 전에 데이터 세트를 조사하고 올바른 결과를 얻습니다. 두 번째 블록은 내 사람들이 원시 SQL 액세스에 대해 너무 많이 다루지 않았기 때문에 다른 사람들이 본 것입니다. 나는 다른 사람들과 비슷한 코드를 골라서 추론을 이해할 수 있습니다. (코드는 VB, C # 및 PHP에 있습니다).
WernerCD

10

왜 그렇게합니까?

유능하지 않은 프로그래머가 작성한 동적 코드 생성이 마음에 듭니다.

SELECT .... WHERE를 생성 한 다음 SOMETHING ....이 있어야합니다. WHERE를 필요할 때만 추가하는 대신 제한이없는 조건을 추가합니다. "전문가"를 해고 할 책임이 있습니다.

아니면 그 사람은 어디에서 필수 일입니까?)

내가 볼 수없는 다른 것.


5

PostgreSQL을 위해 C ++ / C에서 많은 사용자 정의 함수를 프로그래밍하고 있었는데 대기업 (10K 이상)의 다른 사람들이 사용했습니다. 내 함수에는 선택적 where매개 변수가 있습니다. 값이 없으면 절이 사용되지 않습니다. 이것은 명시 적으로 문서화되었습니다. 불행히도 아무도이 기능을 사용하지 않았으며 모든 사람들이 where 1=1절을 제공하는 곳에서만 사용했습니다 . 이론적으로 이것은 현명하지 않은 것처럼 보이지만 실제로 모든 쿼리 최적화 프로그램은 이러한 유형의 문을 배제합니다. 그리고 10K 명을 교육하는 것은 어렵습니다.


3
아무도 UDF에 전화 한 적이 WHERE 1=1; DROP TABLE CUSTOMERS없습니까?
Twinkles December

여전히 Where 1 절을 사용하는 개념을 찾을 수 없습니다. 더 많은 설명이 필요하십니까? 실행 시간이 개선되지 않았으므로.
ursitesion

이것은 실행 시간과 거의 관련이 없습니다. 사람들이 프로그래밍하는 방식은 문화와 관련이 있습니다. 엔지니어가 코드 (IT 담당자가 프로그래밍)를 사용하는 경우가 있습니다. 이 사람들은 여러분의 코드를 생각하고 호출하는 자신 만의 방법을 가지고 있습니다
arthur

@Twinkles : 이것은 확실히 흥미로운 문제입니다. 여기에 주목해야 할 몇 가지 사항이 있습니다. (i) 데이터베이스는 UDF에 대해 읽기 전용입니다. (ii) 내 함수는 여러 테이블 그룹을 여러 가지 요소로 조인하여 데이터웨어 하우징 창 기능을 더 악화시킵니다. 이것은 불가능하지는 않지만, 무엇이든 버리는 것을 어렵게 만듭니다. (iii) UDF는 사전 제작 코드 용입니다. 함수가 도전을 통과하면 다른 부서가 완전히 우리가 프로그램의 모든 다시 작성 : 어떤은 생산에 들어간되지 않음을 의미합니다
아서

4
실제로 10,000 명을 교육하는 것은 매우 쉽습니다. 그들이 잘못하면 응용 프로그램이 실패하게하십시오. 그들은 즉시 잘못하는 것을 멈출 것입니다.
Jasmine

2

"where 1 = 1"을 사용하면 동적 SQL 'where'절 생성에 필요한 코드의 복잡성이 줄어 듭니다. 그렇지 않으면 'where'절을 작성할 때 이것이 추가 된 각 구성 요소의 첫 번째 구성 요소인지 확인해야합니다. 이는 코드 복잡성을 줄이고 가능한 경우 코드 복잡성을 줄이는 간단한 코드 패턴이며, 거의 항상 올바른 결정입니다.


0

프로그래밍 관점에서 1 = 1을 사용합니다.여기에 이미지 설명을 입력하십시오

런타임에 쿼리를 구성해야하고 짧거나 길 수있는 경우와 같은 상황에서 'where 1 = 1 AND'

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);
        }

일을 더 쉽게

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.