2017-09-03 6 views
0

내가이 쿼리에 문제가 유착, 그것은 나에게문자 세트 불일치

ORA-00932: inconsistent datatypes: expected NCHAR got NUMBER 
00932.00000 - "inconsistent datatypes: expected% s got% s" 
* Cause: 
* Action: 
Error in line: 54, column: 43 

서브 쿼리가 문자를 반환 오류 "F"이상이있는 학생의 성별의 "M"을 알려줍니다 이것은 작동하지만 문제는 내가 genero_a이

SELECT NOMBRE, COALESCE(DIRECCION,CORREO, 10) comm 
FROM ESTUDIANTE 
WHERE GENERO_A = 
    (SELECT GENERO_A 
    FROM ESTUDIANTE 
    GROUP BY GENERO_A 
    HAVING COUNT(GENERO_A) = 
     (SELECT MAX(COUNT(*)) as CONTAR 
     FROM ESTUDIANTE 
     GROUP BY GENERO_A)) 
ORDER BY NOMBRE; 

나는 전혀 능숙 SQL에서 아닙니다, 나는 양해 해 주셔서 감사합니다 = 변수 에 그 문자를 할당하는 방법이다. 모든 필드가 동일한 데이터 유형을 가지고 있지 않기 때문에

--TABLA ESTUDIANTE

CREATE TABLE ESTUDIANTE(
    ID_LECTOR VARCHAR2(50) NOT NULL, 
    NOMBRE VARCHAR2(50), 
    APELLIDO VARCHAR2(50), 
    GENERO_A CHAR(1) CONSTRAINT CH_GENERO_A CHECK(GENERO_A IN ('f', 'm')), 
    DIRECCION NVARCHAR2(100), 
    CORREO NVARCHAR2(50) 
); 
ALTER TABLE ESTUDIANTE ADD CONSTRAINT PK_ESTUDIANTE PRIMARY KEY(ID_LECTOR); 
+0

에 NCHAR' '으로 정의된다 귀하의 데이터베이스와 당신은에서 반환되는'NUMBER'와 그것을 비교하고 있습니다 하위 쿼리. 결과를'char'로 변경하십시오. – Ofisora

+0

하위 쿼리가 char "f"또는 "m"을 반환하면 char로 변경해야하는 항목은 무엇입니까? : 이해하지 못했습니다. 죄송합니다 ... 편집 : Genero_a는 CHAR (1)로 정의됩니다. – RicardoBarros

+0

다음과 같이 테이블 구조를 게시 할 수 있습니까? 데이터 유형과 어느 것이 54 행입니까? – Ofisora

답변

4

오류는 COALESCE(DIRECCION,CORREO, 10)에 있습니다.

솔루션 : 당신은 방향과 CORREO의 같은 유사한 데이터 형 NUMBER (10)를 캐스팅해야합니다. 위의 코드를 COALESCE(DIRECCION,CORREO, CAST(10 as NVARCHAR2(2)))으로 변경하십시오.

CAST 함수는 한 데이터 유형의 값을 다른 데이터 유형으로 변환합니다.

업데이트 쿼리

SELECT NOMBRE, COALESCE(DIRECCION,CORREO, CAST(10 as NVARCHAR2(2))) comm 
FROM ESTUDIANTE 
WHERE GENERO_A = 
    (SELECT GENERO_A 
    FROM ESTUDIANTE 
    GROUP BY GENERO_A 
    HAVING COUNT(GENERO_A) = 
     (SELECT MAX(COUNT(*)) as CONTAR 
     FROM ESTUDIANTE 
     GROUP BY GENERO_A)) 
ORDER BY NOMBRE; 

또는 사용자가 제공 한 link에서,

SELECT NOMBRE, COALESCE(DIRECCION,CORREO, N'10') comm 
FROM ESTUDIANTE 
WHERE GENERO_A = 
    (SELECT GENERO_A 
    FROM ESTUDIANTE 
    GROUP BY GENERO_A 
    HAVING COUNT(GENERO_A) = 
     (SELECT MAX(COUNT(*)) as CONTAR 
     FROM ESTUDIANTE 
     GROUP BY GENERO_A)) 
ORDER BY NOMBRE; 

또는 당신의 genero_a을 의미

SELECT NOMBRE, COALESCE(DIRECCION,CORREO, N''||10) comm 
FROM ESTUDIANTE 
WHERE GENERO_A = 
    (SELECT GENERO_A 
    FROM ESTUDIANTE 
    GROUP BY GENERO_A 
    HAVING COUNT(GENERO_A) = 
     (SELECT MAX(COUNT(*)) as CONTAR 
     FROM ESTUDIANTE 
     GROUP BY GENERO_A)) 
ORDER BY NOMBRE; 
+0

감사합니다. 현재 작동 중입니다. 다른 게시물 (https://stackoverflow.com)을 읽었습니다./questions/15967201/ora-12704-character-set-mismatch) 하지만 그게 작동하지 않습니다. 왜 그런가요? "예를 들어 좋아하는 것"을 추가하려고했습니다. "COALESCE (EMAIL, n'NO EMAIL) "코드가 모두 파란색으로 바뀝니다 – RicardoBarros

+0

@RicardoBarros 답변 됨 업데이트되었습니다. 작동중인 경우 응답을 upvote/accept 할 수 있습니다. – Ofisora

+0

나는 이미 수락했습니다 :) thanks @ ofisora하지만 의심의 여지가, 왜 내 코드는 SQL 시트에서 내가 n'10 '또는 N' '추가 라인에서 파란색으로 바뀌지 || 끝에서 10 시까 지? – RicardoBarros