2009-08-12 4 views
8

가능한 중복은 :
Why would a sql query have “where 1 = 1”
Why would someone use WHERE 1=1 AND <conditions> in a SQL clause?SQL 문에서 WHERE 1 = 1을 사용하는 목적은 무엇입니까?

나는 다른 쿼리 예제를 많이하고 아마 모든 SQL 엔진에가는 것을 보았다.

조건이 정의되지 않은 쿼리가있는 경우 사람들 (특히 ORM 프레임 워크)은 종종 always-true 조건 인 WHERE 1 = 1 또는 그와 비슷한 것을 추가합니다.

그래서 대신

SELECT id, name FROM users; 

들이

SELECT id, name FROM users WHERE 1 = 1; 

난 당신이 조건을 추가하는 경우 생각할 수있는 유일한 가능한 이유 동적으로 초기 AND을 제거에 대해 걱정할 필요가 없습니다 사용하지만 여전히 매우 자주이 1 = 1 조건은 쿼리에 실제 조건이 있으면 제거됩니다. (프레임 워크에 의해 생성) CakePHP의 발

실제 예 :

(NO 조건)

SELECT `User`.`id`, `User`.`login` 
FROM `users` AS `User` 
WHERE `User`.`login` = '[email protected]' 
LIMIT 1; 

(조건)

SELECT `User`.`id`, `User`.`login` 
FROM `users` AS `User` WHERE 1 = 1 
ORDER BY `User`.`id` ASC; 

여분 조건 것을 추가에 대한 이유가 있는가?

+1

다른 사람들과 마찬가지로 http://stackoverflow.com/questions/517107/why-would-a-sql-query-have-where-1-1에 속합니다. –

답변

4

그래, 일반적으로 'where 1 = 0'으로 시작하므로 명령문이 실패하게됩니다.

트랜잭션을 래핑하고 마지막에 커밋하지 않고 쿼리를 테스트하는 더 순진한 방법입니다. (이것은 선호되는 방법입니다).

+0

하나 이상의 답변이있을 수 있습니다. 이 경우 OP는 동적 쿼리를 작성하는 것이 아니라 (ORM의 요즘 동적 쿼리를 작성하는 경우 솔직히 자신을 잘 살펴보십시오) 정교했습니다. –

2

실제로 1 = 1을 사용하는 것은 전체 테이블 스캔 자체가 발생할 수 있으므로 실제로는별로 좋지 않습니다. >T-SQL 1=1 Performance Hit

+1

DBMS의 가장 까다로운 점에서만. – paxdiablo

+1

귀하가 1 = 1이라고 말한 질문에있는 모든 답변에는 아무런 영향이 없습니다. – Ryan

13

명이 프로그램을 SQL 쿼리를 작성하는 경우 그것은 또한 일반적인 관행이다, 그것은 '1 = 1 곳'다음은 추가 '및 customer.id 시작하는 단지 쉽게 -

이 참조 = : 고객 id가 제공되는지에 따라 custId '. 'and ...'로 시작하는 쿼리의 다음 부분을 항상 추가 할 수 있습니다.

+1

-1 이것은 "처음 AND를 제거하는 것에 대해 걱정할 필요가 없습니다"라는 질문을 반복합니다. – Andomar

1

당신이 말했듯이 :

당신이 조건을 추가하는 경우가 동적으로 유일한 이유가 될 수 있다는 초기 및 을 제거에 대해 을 걱정할 필요가 없습니다 , 당신이 옳다.

4

1 = 1은 항상 모든 rdbms에서 무시됩니다.쿼리를 WHERE 1 = 1으로 실행하면 절충안이 없습니다. ORM 프레임 워크 또는 다른 같은 동적 조건을 구축

매우 자주 수행이 추가 용이하다실제 위치를 조건 현재 상태에 을 붙이는 검사 피할 수 있기 때문이다.

stmt += "WHERE 1=1"; 
if (v != null) { 
    stmt += (" AND col = " + v.ToString()); 
} 

이것은 1 = 1이 아닌 것처럼 보입니다.

var firstCondition = true; 
... 
if (v != null) { 
    if (!firstCondition) { 
     stmt += " AND "; 
    } 
    else { 
     stmt += " WHERE "; 
     firstCondition = false; 
    } 
    stmt += "col = " + v.ToString()); 
} 
+1

사실 저는 다음과 같은 경향이 있습니다 : cmd = "select ..."; sep = "where"; foreach (cond) {cmd + = sep + cond; sep = "and"; } – paxdiablo

+0

* 작은 * 청소기로 보입니다. – paxdiablo

+0

좋은 아이디어! 나는 더 프로그래밍을 염두에 둔다. – Christian13467

3

사람들은 동적 SQL 쿼리를 작성할 때 본질적으로 게으르기 때문에이를 사용합니다. "where 1 = 1"으로 시작하면 모든 추가 조항이 "and"으로 시작되고 알아낼 필요가 없습니다.

본질적으로 게으르다는 것은 잘못된 것이 아닙니다. "빈"목록이 두 개의 센티넬 노드로 구성되어 있고 first->next에서 처리를 시작할 때까지 last->prev까지 이중 연결 목록을 보았습니다.

실제로 이것은 firstlast 노드를 삭제하기위한 모든 특수 처리 코드를 제거했습니다. 이 설정에서 first 또는 last을 삭제할 수 없기 때문에 모든 노드가 중간 노드였습니다. 노드 두 개가 낭비되었지만 코드가 더 간단하고 (약간만 빨랐습니다).

"1 = 1"구조를 본 유일한 곳은 BIRT입니다. 보고서는 위치 매개 변수를 사용하는 경우가 많으며 자바 스크립트로 수정하여 모든 값을 허용합니다. 따라서 쿼리

select * from tbl where ((col = ?) or (1 = 1)) 

이 새로운 질의는 위치 파라미터 주위 하구없이 사용할 수있게 :

select * from tbl where col = ? 

사용자가 파라미터 "*" 선택

col 사용되고 읽을 수정 세부. 여전히 정확히 하나의 매개 변수가 있습니다. 괜찮은 DBMS (예 : DB2/z)는 실행 계획을 구성하기 전에 기본적으로 절을 완전히 제거하도록 쿼리를 최적화하므로 절충점이 없습니다.

+0

고마워! 이것은 가장 그럴듯한 대답이었습니다! –

관련 문제