복붙노트

[SQL] 위한 SQL 구문 용어 WHERE (COL1, COL2) <(VAL1, val2만큼) '

SQL

위한 SQL 구문 용어 WHERE (COL1, COL2) <(VAL1, val2만큼) '

내 질문 상태로, 우리가 즉 WHERE 절에서 조건의 유형과 쿼리의 유형을 부르는 알고 싶다 :

SELECT * FROM mytable
WHERE (col1, col2) < (1, 2);

다시 말해: 값 중에 NULL이없고 - 나에게 COL1 덜 '1'보다거나 '1'에 해당하는 경우 그 다음 COL2 덜 '2'보다해야합니다 모든 레코드를 제공합니다.

정말 구문의 유형과 같은 I,하지만 명명 규칙 조건의이 유형을 참조하는 방법이 무엇인지 모른다. 그것은 튜플 조건처럼 보이지만, 그 이름은 나에게 내 검색 아무것도 제공하지 않습니다.

내 질문이 구문은 최대 절전 모드 및 JPA2와 포스트 그레스이 사용 기준 API를 작성하는 방법을 연구하기 위해서라는 것을 알 필요에서 유래한다.

나는 CriteriaBuilder의 기능 () 호출을 사용하여이 사용 기준 API를 쓸 수 있었다 :

//Our left expression (date, id)
Expression leftVal = criteriaBuilder.function("ROW", Tuple.class,     
        from.get("date").as(java.util.Date.class),
        from.get("id").as(Long.class));

//Our right expression ex: ('2015-09-15', 32450)
ParameterExpression<Date> dateParam = criteriaBuilder.parameter(Date.class);
ParameterExpression<Long> idParam = criteriaBuilder.parameter(Long.class);
Expression rightVal = criteriaBuilder.function("ROW", Tuple.class, dateParam, idParam)

//build the first predicate using ROW expressions
Predicate predicate = criteriaBuilder.greaterThan(leftVal, rightVal);

//more query building happens
... 

//construct final query and add parameters to our param expressions
TypedQuery<MyEntity> typedQuery = em.createQuery(criteriaQuery);
typedQuery.setParameter(dateParam, current.getDate());
typedQuery.setParameter(idParam, current.getId());

이 경우 현재 우리가 이전 또는 이후에 기록을 얻을하려는 행으로 검색 기록이다. 이 예에서 나는 초과] 함수 호출에 의해 언급 된 후 않습니다.

해결법

  1. ==============================

    1.일반적인 단기는 "행 값"입니다. 당신이 보여 작동 또는 "행 값 비교". 그 기능은 SQL-92 이후 SQL 표준에 있었다 (!). 포스트 그레스는 현재 유일한 주요 RDBMS입니다 모든 측면에서 지원을 - 특히 또한 최적의 인덱스를 지원.

    일반적인 단기는 "행 값"입니다. 당신이 보여 작동 또는 "행 값 비교". 그 기능은 SQL-92 이후 SQL 표준에 있었다 (!). 포스트 그레스는 현재 유일한 주요 RDBMS입니다 모든 측면에서 지원을 - 특히 또한 최적의 인덱스를 지원.

    특히, 식 (COL1, COL2) <(1, 2)는 포스트 그레스 단지 ROW 속기 (COL1, COL2)

    그것은 더 자세한 동등한 표현 편리하게 짧은 :

    col1 < 1 OR (col1 = 1 AND col2 < 2)
    

    ... 및 포스트 그레스에 대한이 (COL1, COL2) 또는 (COL1의 DESC, COL2 DESC)에 대한 인덱스를 사용할 수있다.

    그리고에서 특히 독특한 (!)

    col1 < 1 AND  AND col2 < 2
    

    예를 생각해 (1,1) ...

    여기에 상세 페이지 매기기에 기능에 대해 설명 마르쿠스 Winand하여 프리젠 테이션은 다음과 같습니다

    use-the-index-luke.com의 "매김은 PostgreSQL의 방법을 수행".

    페이지 20 행에 값을 비교 시작 지지체는 45 페이지되는 I는 언급 된 매트릭스.

    내가 인용 한 소스의 제휴 어떠한 방식으로 생각합니다.

  2. ==============================

    2.

    WHERE (col1, col2) < (val1, val2)
    

    위 구문은 행 값 생성자 / 튜플 구문 / 행 부질이라고합니다.

    문서에서

    또한 그것은 행 서브 쿼리를 호출 할 수 있습니다

  3. ==============================

    3.표현 목록

    표현 목록

    행 값 생성자의 사용 비교 술어에서 (RVC) - 꽤 오랜 기간

    RVCs는 보통 INSERT 문에서 볼되지만, 드물게 WHERE 조항의 일환으로.

    나는이 구문은 JPA 또는 최대 절전 모드 기준 API에 직접적인 지원을하고 있음을 의심하지 않지만, 같은 논리를 달성하기위한 해결 방법은 항상있다.

  4. from https://stackoverflow.com/questions/32981903/sql-syntax-term-for-where-col1-col2-val1-val2 by cc-by-sa and MIT license