2014-02-11 5 views
0

조건을 기반으로 복잡한 SQL 쿼리를 작성하려고합니다. 조건이 만족되면 다른 조건이 아닌 하나의 조건으로 쿼리를 실행해야합니다. SQL에서 어떻게 가능합니까? ${passedInVar}가 null고급 SQL 조건 기반 쿼리 작성

SELECT distinct support_id AS object_id, 2 as app_context_id, 
      0 as domain_cdc_id, 'S' as object_type, 
      'NEW' as domain_cdc_status, 1 as attribute_group_num,s 
      sysdate as created_on 
FROM fdrdbo.v_facility_support 
WHERE support_version_valid_from_dt = to_date('${passedInVar}', 'yyyy/mm/dd') 

경우, 내가 대신 다음 WHERE 조건을 사용하려면 :

WHERE SYSDATE BETWEEN support_version_valid_from_dt AND support_version_valid_to_dt 

미리 감사드립니다.

+0

캔트 이 데이터는 비즈니스 데이터 소스에서 가져오고 응용 프로그램 내에서 쿼리를 수정합니다. – user836087

+0

어떤 SQL 엔진을 사용하고 있습니까? MySQL, SQL Server, Oracle 및 Postgres는 모두 다른 방언입니다. –

답변

1

이 PostgreSQL을에서 작동합니다 (to_date는 PostgreSQL을에 존재하는) 당신이 간단한 문자열 대체를하고있는 변수를 전달하는 드라이버를 사용하고 있지 않습니다 있으리라 믿고있어

where 
    support_version_valid_from_dt = to_date(:passedinvar, 'yyyy/mm/dd') 
    or 
    (
     sysdate between support_version_valid_from_dt and support_version_valid_to_dt 
     and 
     :passedinvar is null 
    ) 

알 수 있습니다.

to_datenull 인수에 대해 null을 반환합니다. Postgresql에서 null과 비교하면 null이 반환됩니다. 두 번째 조건은 전달 된 변수가 null 인 경우에만 검사됩니다.

+0

문자열 대체가됩니다 – user836087

+0

@ user836087 그렇게해서는 안됩니다. 아주 나쁜 습관. 이 특정 사례가 안전하다고 확신하더라도 관련없는 코드 리팩토링 등의 작업을 수행 한 후 http://bobby-tables.com/ 놀라운 일이 발생할 수 있습니다. –