2009-01-11 10 views
6

SQL 쿼리에 뭔가를 전달하여 특정 열이 null 인 것만 선택할지 결정할 수 있기를 원합니다. 바운드 변수 대신 쿼리 문자열을 작성하는 경우 다음과 같은 작업을 수행합니다.Perl의 DBI에서 바인드 된 쿼리를 사용하여 null 인 행을 어떻게 선택합니까?

if ($search_undeleted_only) 
{ 
    $sqlString .= " AND deleted_on IS NULL"; 
} 

그러나 바운드 쿼리를 사용하고 싶습니다. 이것이 최선의 방법일까요?

my $stmt = $dbh->prepare(... 
    "AND (? = 0 OR deleted_on IS NULL) "); 
$stmt->execute($search_undeleted_only); 

답변

4

예; 관련된 트릭은 템플릿이 " AND (?=-1 OR some_field = ?) "이라고 말하고, 실행 호출을 감싸고 모든 두 번째를 바인드하는 특수 함수를 만드는 것입니다. (이 경우 -1은 '이 필터 무시'를 의미하는 특수 값임).

Paul Tomblin의 업데이트 : 의견의 제안을 포함하도록 답변을 편집했습니다.

+0

많은 SQL 데이터베이스가 단락 회로 (즉, 첫 번째 요소가 첫 번째 요소 인 경우 첫 번째 요소가 첫 번째 요소 인 경우 OR 구문의 후속 부분을 평가하지 않아도되므로 의미가 없으므로? 부분은 진실합니다. 아무 것도 평가할 방법이 없으므로 사실입니다.) –

+0

로버트가 맞습니다.'? = - 1'은 먼저 가야합니다. – SquareCog

+0

여러분들이 괜찮기를 바랍니다.하지만 답을 더 잘 만들기 위해? = - 1을 넣으려는 답을 편집 할 것입니다. –

1

저는 이것이 합리적인 접근이라고 생각합니다. 정상적인 필터 패턴을 잘 따르고 좋은 성능을 제공해야합니다.

2

그러면 부울 식의 단락 의미론에 의존하여 IS NULL 조건을 호출합니까? 그것은 작동하는 것 같습니다.

재미있는 점 중 하나는 쿼리 최적화 프로그램에서 매개 변수가없는 1 = 0과 같은 상수 식을 계산해야한다는 것입니다. 이 경우 옵티마이 저는 실행 시간까지 표현식이 상수 true 또는 false인지 여부를 알지 못하기 때문에이를 제외 할 수 없습니다. 모든 행에 대해 표현식을 평가해야합니다.

그래서 매개 변수화되지 않은 상수 표현식을 사용했다면 비용에 비해 상대적으로 적은 비용이 추가된다고 가정 할 수 있습니다.

그런 다음 ORIS NULL 표현식을 결합하면 최적화 프로그램에 영향을 미칠 수 있습니다. deleted_on의 색인으로는 이점을 얻을 수 없다고 판단 할 수 있습니다. 이는 사용중인 RDBMS 구현 W 데이터베이스의 값 분산에 따라 다 (니다.

+0

@Bill, 그건 쿼리 최적화에 대한 정말 좋은 정보이고, 나는 당신과 Dmitriy의 대답을 모두 받아 들일 수 있었으면 좋겠다. –

+0

걱정할 필요가 없습니다! 나는 그것이 유용했기 때문에 기쁘다. –