728x90

ORA-00976: Specified pseudocolumn or operator not allowed here

 

Environment

  • Language: Oracle

 

Problem

    SELECT LEVEL-1 HOURS
           , NVL(COUNT(TO_CHAR(DATETIME, 'FMHH24')), 0) COUNT
      FROM DUAL 
RIGHT JOIN ANIMAL_OUTS
        ON (LEVEL-1) = TO_CHAR(DATETIME, 'FMHH24')
CONNECT BY LEVEL <= 24
  ORDER BY LEVEL
;

 

Cause of Problem

LEVEL 같은 의사컬럼이나 연산자가 허용되지 않는 위치에 사용됨
LEVEL 의사컬럼은 FROM 절에서 직접적으로 사용될 수 없고, CONNECT BY 절에서 계층형 쿼리를 구성할 때 사용되어야 함

  • pseudocolumn(의사컬럼): 테이블의 컬럼처럼 동작하지만 실제로 테이블에 저장되지는 않는 컬럼

 

Solution

  • LEVEL의 위치를 FROM절에서 CONNECT BY절로 이동
   SELECT LEVEL-1 HOURS
          , NVL(
              (SELECT COUNT(*)
                 FROM ANIMAL_OUTS
                WHERE TO_CHAR(DATETIME, 'HH24') = TO_CHAR(LEVEL-1, 'FM00')), 0) COUNT
      FROM DUAL
CONNECT BY LEVEL <= 24
  ORDER BY LEVEL
;

 

📚 참고 자료

 

728x90
728x90

👉 기본 환경

- Language: Oracle

 

 

⌨️ 코드

1
2
3
4
5
6
7
8
9
10
11
WITH SUB AS (
      SELECT TO_CHAR(DATETIME'FMHH24') AS HOUR
        FROM ANIMAL_OUTS
    GROUP BY TO_CHAR(DATETIME'FMHH24')
)
  SELECT HOUR, COUNT(*) AS COUNT
    FROM SUB
   WHERE HOUR BETWEEN 9 AND 19
ORDER BY TO_NUMBER(HOUR)
;
 
 

 

 

🖨️오류

ORA-00937: not a single-group group function

 

 

📡 원인

GROUP BY 절과 SELECT 절 사이에서 집계 함수가 필요한데, 그룹화되지 않은 열에 대해 집계 함수를 사용하지 않음

 

 

📰 해결 방법

1
2
3
4
5
6
7
8
9
10
11
12
WITH SUB AS (
      SELECT TO_CHAR(DATETIME'FMHH24') AS HOUR,
             COUNT(*) AS COUNT
        FROM ANIMAL_OUTS
    GROUP BY TO_CHAR(DATETIME'FMHH24')
)
  SELECT HOUR, COUNT
    FROM SUB
   WHERE HOUR BETWEEN 9 AND 19
ORDER BY TO_NUMBER(HOUR)
;
 
 

SELECT절에 집계함수 COUNT 추가

 

728x90
728x90

👉 기본 환경

- Language: Oracle

 

 

⌨️ 코드

1
2
3
4
5
6
  SELECT TO_CHAR(DATETIME'h24') HOUR, COUNT(*) COUNT
    FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME'h24')
ORDER BY HOUR
;
 
 

 

 

🖨️오류

ORA-01821: date format not recognized

 

 

📡 원인

TO_CHAR() DATE FROMAT에 'h24' 타입이 없음

 

 

📰 해결 방법

1
2
3
4
5
6
  SELECT TO_CHAR(DATETIME'hh24') HOUR, COUNT(*) COUNT
    FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME'hh24')
ORDER BY HOUR
;
 
 

TO_CHAR() DATE FROMAT에 있는 데이터 타입(hh24 - 24시간 표기) 사용

 

728x90
728x90

👉 기본 환경

- Language: Oracle

 

 

⌨️ 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
  SELECT B.TITLE, 
         B.BOARD_ID, 
         R.REPLY_ID, 
         R.WRITER_ID, 
         R.CONTENTS, 
         TO_CHAR(R.CREATED_DATE, 'YYYY-MM-DD') CREATED_DATE
    FROM USED_GOODS_BOARD B 
    JOIN USED_GOODS_REPLY R 
      ON B.BOARD_ID = R.BOARD_ID
   WHERE B.CREATED_DATE = 2022-10
ORDER BY R.CREATED_DATE, B.TITLE
;
 
 

 

 

🖨️오류

ORA-00932: inconsistent datatypes: expected DATE got NUMBER

 

 

📡 원인

DATE 데이터 유형을 숫자와 비교하려고 시도

Oracle에서는 DATE 형식의 날짜와 숫자 간의 직접적인 비교를 허용하지 않음

 

 

📰 해결 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
  SELECT B.TITLE, 
         B.BOARD_ID, 
         R.REPLY_ID, 
         R.WRITER_ID, 
         R.CONTENTS, 
         TO_CHAR(R.CREATED_DATE, 'YYYY-MM-DD') CREATED_DATE
    FROM USED_GOODS_BOARD B 
    JOIN USED_GOODS_REPLY R 
      ON B.BOARD_ID = R.BOARD_ID
   WHERE TO_CHAR(B.CREATED_DATE, 'YYYY-MM'= '2022-10'
ORDER BY R.CREATED_DATE, B.TITLE
;
 
 

TO_CHAR()를 통한 문자열간 비교로 변경

 

728x90
728x90

👉 기본 환경

- Language: Oracle

 

 

⌨️ 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
   SELECT B.TITLE, 
         B.BOARD_ID, 
         R.REPLY_ID, 
         R.WRITER_ID, 
         R.CONTENTS, 
         TO_CHAR(R.CREATED_DATE, 'YYYY-MM-DD') CREATED_DATE
    FROM USED_GOODS_BOARD B 
    JOIN USED_GOODS_REPLY R 
      ON B.BOARD_ID = R.BOARD_ID
   WHERE B.CREATED_DATE >= '2022-10-01'
     AND B.CREATED_DATE < '2022-11-01'
ORDER BY R.CREATED_DATE, B.TITLE
;
 
 

 

 

🖨️오류

ORA-01861: literal does not match format string

 

 

📡 원인

DATE 데이터 유형이과 문자열의 비교

Oracle에서는 DATE 형식의 날짜와 문자열 간의 직접적인 비교를 허용하지 않음

 

 

📰 해결 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  SELECT B.TITLE, 
         B.BOARD_ID, 
         R.REPLY_ID, 
         R.WRITER_ID, 
         R.CONTENTS, 
         TO_CHAR(R.CREATED_DATE, 'YYYY-MM-DD') CREATED_DATE
    FROM USED_GOODS_BOARD B 
    JOIN USED_GOODS_REPLY R 
      ON B.BOARD_ID = R.BOARD_ID
   WHERE B.CREATED_DATE >= DATE '2022-10-01'
     AND B.CREATED_DATE < DATE '2022-11-01'
ORDER BY R.CREATED_DATE, B.TITLE
;
 
 

DATE 타입임을 명시

 

🚨 DATE 타입 사용 시, 'YYYY-MM-DD' 형태로만 사용 가능

1
2
3
4
5
6
7
8
9
10
11
12
13
  SELECT B.TITLE, 
         B.BOARD_ID, 
         R.REPLY_ID, 
         R.WRITER_ID, 
         R.CONTENTS, 
         TO_CHAR(R.CREATED_DATE, 'YYYY-MM-DD') CREATED_DATE
    FROM USED_GOODS_BOARD B 
    JOIN USED_GOODS_REPLY R 
      ON B.BOARD_ID = R.BOARD_ID
   WHERE B.CREATED_DATE >= DATE '2022-10'
ORDER BY R.CREATED_DATE, B.TITLE
;
 
 

사용 시, ORA-01861: literal does not match format string 오류 발생

 

728x90