문제

가능한 복제물 :
SQL 쿼리에 왜 "1 = 1"이 있습니까?
왜 누군가가 1 = 1과u003Cconditions> SQL 조항에서?

다른 쿼리 예제에서 많이 보았고 아마도 모든 SQL 엔진으로 이동합니다.

정의 된 사람 (및 특별히 ORM 프레임 워크) 조건이없는 쿼리가있는 경우 종종 항상 진실한 조건을 추가합니다. WHERE 1 = 1 또는 그런 것.

그래서 대신

SELECT id, name FROM users;

그들은 사용합니다

SELECT id, name FROM users WHERE 1 = 1;

당신이 동적으로 조건을 추가하는 경우 생각할 수있는 유일한 이유는 이니셜 스트리핑에 대해 걱정할 필요가 없습니다. AND 그러나 여전히 이것 1 = 1 쿼리에 실제 조건이 있으면 조건이 제거됩니다.

CakePHP의 실제 예 (프레임 워크에 의해 생성) :

(조건 없음)

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

(상태와 함께)

SELECT `User`.`id`, `User`.`login`
FROM `users` AS `User` 
WHERE `User`.`login` = 'me@example.com'
LIMIT 1;

추가 상태를 추가 할 이유가 있습니까?

도움이 되었습니까?

해결책

예, 일반적으로 '1 = 0'으로 시작하여 진술이 실패하도록 강요하기 때문입니다.

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

다른 팁

사람들이있을 때도 일반적인 관행입니다 프로그래밍 방식으로 SQL 쿼리 구축, 고객 ID가 제공되는 경우에 따라 'where 1 = 1'으로 시작하는 것이 더 쉽습니다. 따라서 'and ...'로 시작하는 쿼리의 다음 부분을 항상 추가 할 수 있습니다.

그만큼 1=1 항상 모든 RDBM에 의해 무시됩니다. 쿼리를 실행하는 트레이드 오프가 없습니다 여기서 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());
}

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

본질적으로 게으른 것이 잘못된 것은 아닙니다. "빈"목록이 두 개의 센티넬 노드로 구성된 이중 연결 목록을 보았고 first->next 까지 last->prev 포함한.

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

"1 = 1"구조물을 본 유일한 곳은 Birt입니다. 보고서는 종종 위치 매개 변수를 사용하며 모든 값을 허용하기 위해 JavaScript로 수정됩니다. 그래서 쿼리 :

select * from tbl where col = ?

사용자가 선택할 때 "*" 사용중인 매개 변수의 경우 col 읽기로 수정됩니다.

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

이를 통해 위치 매개 변수 세부 사항을 다루지 않고 새 쿼리를 사용할 수 있습니다. 여전히 그러한 매개 변수가 정확히 하나 있습니다. 괜찮은 DBMS (예 : DB2/Z)는 해당 쿼리를 최적화하여 기본적으로 실행 계획을 구성하기 전에 절을 완전히 제거하기 위해 조항을 완전히 제거하므로 트레이드 오프가 없습니다.

1 = 1을 사용하는 것은 실제로 전체 테이블 스캔을 유발할 수 있으므로 그다지 좋은 생각이 아닙니다.

이것을 참조하십시오-> T-SQL 1 = 1 성능 히트

당신이 말했듯이 :

조건을 동적으로 추가하는 경우 초기 스트리핑에 대해 걱정할 필요가 없으며 이것이 유일한 이유입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top