IT일반2014. 10. 14. 06:13

보통 SQL의 Where절을 구성할 때에는 다음과 같은 빈번한 형태에서 벗어나기 힘들다.

WHERE col1=val1 AND col2=val2 AND …

천편일률적 형태이긴 하지만, 실제로 이런 형태로 대부분의 문제는 해결되기 마련이다. 하지만 SQL이 아닌 일반 프로그래밍 언어에서 많이 사용하는 if문에서처럼 조건문을 Where절로 구현하려면 어떻게 해야 할까?

이산 수학(Discrete Mathematics)에서는 참과 거짓을 다루는 명제와 조건명제에 대한 이야기가 나온다. 명제는 참인지 거짓인지를 명확하게 판별할 수 있는 문장이나 수식을 말하며, p, q, r 등으로 표현한다. 함축(조건명제)은 두 개의 명제가 다음과 같은 관계를 가질 때 성립된다. 각 행의 내용은 동일한 의미를 가지며, 첫 번째 내용은 예시 문장이다.

  • "날씨가 화창하다" "소풍을 간다"
  • p q
  • if p then q

위의 내용은 진리표(Truth Table)에 의해 다음 수식과 논리적으로 동치(Logical Equivalent)한다.

~p q

한글로 된 최초 명제의 예시로 치환하면(의미적으로) 다음과 같다.

"날씨가 나쁘거나 소풍을 간다"

날씨가 화창하다면 소풍을 가는지의 여부에 따라 참 거짓이 판별이 나는 것이고, 날씨가 나쁘면 소풍 여부는 상관이 없게 된다.

SQL 이야기로 돌아와서, 무조건 어떤 수식을 검사해야 하는 것이 아닌, 특정 조건에 따라 검사를 하거나 하지 않는 여부가 달라지는 복합적인 조건이 있다면 대개는 SQL을 동적으로 생성하는 외부 프로그래밍 언어 레벨이나 조건별 지시자를 이용하는 쿼리 프레임워크 레벨에서 if문과 같은 기능을 이용하여 복잡하게 구성하려고 하는 시도를 많이 보게 된다.

WHERE 1=1 (if condition1 = value1 then) AND A=B (end if)

위에서 설명한 명제의 함축을 이용하면 SQL 내에서 논리적 수식 만으로도 이러한 의미를 동일하게 구사할 수 있다.

WHERE (condition1 <> value1 OR A = B)

OR가 들어가니 성능에 영향을 줄까 걱정을 할 수도 있지만, OR 연산자의 앞부분이 참이면 뒷부분은 실제 평가를 하지 않고 넘어가는 쿼리 옵티마이저의 특성을 생각하면 결론적인 성능차이는 걱정할 수준이 되지 못한다.

Posted by nextream