이 기능이 있습니다.
CREATE FUNCTION ISROOMAVAILABLE(P_ID_ROOM INT, P_DATE DATE) RETURN BOOLEAN
IS
V_COUNT INT;
BEGIN
SELECT count(*)
INTO V_COUNT
FROM CHECKIN A
LEFT JOIN CHECKOUT B ON (A.ID_RESERVATION = B.ID_RESERVATION)
WHERE A.ID_ROOM = P_ID_ROOM
AND ((A.DATE >= trunc(P_DATE) AND B.DATE IS NULL)
OR
(A.DATE <= trunc(P_DATE) AND B.DATE >= trunc(P_DATE)));
RETURN (V_COUNT > 0);
END;
특정 날짜에 방 (ID로 식별 됨)을 사용할 수있는 경우 true를 반환합니다.
그리고 위의 함수를 선택하여 결정자로 사용하여 여러 매개 변수를 확인하고 싶습니다.
SELECT Q.ID, COUNT(R.DATE_OUT - R.DATE_IN) AS DAYS
FROM QUARTO Q
JOIN CHECKIN CI ON Q.ID = CI.ID_ROOM
JOIN RESERVATION R ON CI.ID_RESERVATION = R.ID
WHERE (EXTRACT(YEAR FROM R.DATE_IN) = EXTRACT(YEAR FROM SYSDATE))
AND (ISROOMAVAILABLE(Q.ID, SYSDATE))
GROUP BY Q.ID
ORDER BY DAYS;
여전히 데이터베이스에서 일부 데이터가 누락 되었기 때문에 함수에서 sysdate를 사용하고 있지만 여전히 "관계형 연산자가 잘못되었습니다"라는 오류가 발생합니다.
"WHERE"절에있는 함수를 사용하는 방법이 있습니까?
포르투갈어의 잘못된 번역을 용서하십시오. 영어로 된 정확한 용어를 모릅니다.
Oracle WHERE
이 SQL 쿼리 의 절 에서 PL / SQL 부울을 평가할 수 없다고 생각 합니다.
가장 간단한 방법은 함수를 수정하여 평가할 수있는 것을 반환하는 것입니다. 예를 들어 1
true와 0
false를 반환 할 수 있습니다 .
CREATE FUNCTION ISROOMAVAILABLE(P_ID_ROOM INT, P_DATE DATE) RETURN INT
IS
V_COUNT INT;
BEGIN
SELECT count(*)
INTO V_COUNT
FROM CHECKIN A
LEFT JOIN CHECKOUT B ON (A.ID_RESERVATION = B.ID_RESERVATION)
WHERE A.ID_ROOM = P_ID_ROOM
AND ((A.DATE >= trunc(P_DATE) AND B.DATE IS NULL)
OR
(A.DATE <= trunc(P_DATE) AND B.DATE >= trunc(P_DATE)));
RETURN LEAST(V_COUNT, 1);
END;
그리고:
WHERE ...
AND ISROOMAVAILABLE(Q.ID, SYSDATE) = 1
함수를 수정할 수없는 경우 SQL에서 평가할 수있는 데이터 유형을 반환하는 다른 함수로 래핑하고 원본 대신 래퍼 함수를 호출해야합니다.
검색어에 대한 관련없는 참고 사항 :
EXTRACT(YEAR FROM R.DATE_IN) = EXTRACT(YEAR FROM SYSDATE)
차선책입니다. 이것은 직접 필터링으로 더 효율적으로 표현됩니다. R.DATE_IN >= TRUNC(SYSDATE, 'YEAR')
AND R.DATE_IN < ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), 12)
COUNT(R.DATE_OUT - R.DATE_IN)
당신이 원하는 것을 할 수 있는지 궁금합니다 . 그것이하는 일은 두 날짜가 아닌 모든 행을 계산하는 것 NULL
입니다. 어쩌면 당신은 의미 : SUM(R.DATE_OUT - R.DATE_IN)
?이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다