문제

MySQL에는 널 안전한 비교 연산자가 있습니다 : <=>. 다음과 같은 준비된 진술을 만들 때 Java 프로그램에서 이것을 사용합니다.

String routerAddress = getSomeValue();
String sql = "SELECT * FROM ROUTERS WHERE ROUTER_ADDRESS <=> ? ";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, routerAddress);

이제 H2 데이터베이스로 전환하고 싶습니다. 순수한 SQL에 <=> 연산자를 어떻게 작성합니까 (예 : NULL이면 NULL이 아닌 경우)? STMT.SetString 작업 만 사용하고 싶습니다 한 번. 열 이름을 여러 번 쓰는 것은 괜찮습니다.

관련 질문입니다 SQL에서 null == null을 얻습니다. 그러나 그 대답은 검색 값을 2 번 작성해야합니다 (즉, 준비 상태에서 2 개의 물음표)!?

참조:http://dev.mysql.com/doc/refman/en/comparison-operators.html#operator_equal-to

도움이 되었습니까?

해결책

관련 질문은 sql에서 null == null을 얻는다. 그러나 그 대답은 검색 값을 2 번 작성해야합니다 (즉, 준비 상태에서 2 개의 물음표)!?

두 번째 순위 및 후속 답변은 검색 값을 두 번 바인딩하지 않고이를 수행하는 방법을 제공합니다.

SELECT * FROM ROUTERS 
WHERE coalesce(ROUTER_ADDRESS, '') = coalesce( ?, '');

이것은 유효한 열 값이 될 수없는 더미 값이 필요합니다 ( "밴드 밖"). 빈 문자열을 사용하고 있습니다. 그러한 값이 없으면 값을 두 번 바인딩해야합니다.

SELECT * FROM ROUTERS 
WHERE ROUTER_ADDRESS = ? or (ROUTER_ADDRESS is null and ? is null);

다른 팁

SQL의 표준 널 안전 평등 연산자입니다 IS DISTINCT FROM 그리고 IS NOT DISTINCT FROM.

SQL에서 NULL은 그 자체와 같지 않습니다. 그래서 당신은 둘 중 하나를 할 수 있습니다 :

1- 더미 값으로 교체하고 다음과 같이 비교하십시오.

SELECT * FROM ROUTERS WHERE ISNULL(ROUTER_ADDRESS,'xxx') <=> ISNULL(?,'xxx')

또는

2- 다음과 같이보다 정교한 논리 테스트로 교체하십시오.

SELECT *
FROM ROUTERS 
WHERE (
       (ROUTER_ADDRESS IS NULL AND ? IS NOT NULL)
       OR
       (ROUTER_ADDRESS IS NOT NULL AND ? IS NULL)
       OR
       (ROUTER_ADDRESS IS NOT NULL AND ? IS NOT NULL AND ROUTER_ADDRESS <> ?
      )

router_address가 null 인 라우터를 원한다면 언제? 그런 다음 Null이면 효과가있을 수 있습니다.

SELECT * 
FROM ROUTERS 
WHERE ROUTER_ADDRESS = (case when ROUTER_ADDRESS is null and ? is null then null 
                             else ? end)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top