2011-01-19 3 views
0

IN 절에 쉼표로 구분 된 문자열을 반환하는 하위 쿼리를 사용하려고합니다.오라클의 IN 절에 쉼표로 구분 된 문자열이 잘못되었습니다.

다음과 같은 방법 :

SELECT p.person_id, g.name || '>>' || p.firstname || ' ' || p.lastname as GROUP_PATH 
FROM PERSON p 
LEFT JOIN GROUP g ON (
    g.group_id = p.group_id 
) 
WHERE p.person_id IN ( 
    SELECT person_ids FROM other WHERE other_id = :OTHER_ID 
) 
ORDER BY lower(GROUP_PATH) 

그리고 나는 다음과 같은 오류가 점점 오전 :

ORA-01722: invalid number.

더 나은이 작업을 수행하는 방법 또는 수 있는가를?

+0

세 테이블 모두에 대해 테이블 ​​정의 (특히 ID 열 유형)를 표시 할 수 있습니까? ': other_id'가 어떻게 정의 되었습니까?숫자 열만 입력하면 varchar에 참여할 수 있습니다. 숫자 만 있거나 숫자 만 일치하면 vPar는 관련성이없는 숫자가 아닌 값으로 넘어갑니다. –

+0

초기 쿼리가 잘못되었음을 알게되었습니다. 나는 그것을 새롭게했다. – Kel

+0

'other'의'person_ids'는 쉼표로 구분 된 목록입니까? 그렇다면 IN 절에서 작동하지 않을 것입니다. 문자열을 컬렉션으로 구문 분석하고 쿼리에서 컬렉션을 사용해야합니다. 그러나 관계형 데이터베이스에 쉼표로 구분 된 키 목록을 저장해서는 안되므로 데이터 모델을 수정하려고합니다. –

답변

4

가장 확실한 설명은 당신이 문자열로 수학을하려고하는 것입니다 ...

The attempted conversion of a character string to a number failed because the character string was not a valid numeric literal. Only numeric fields or character fields containing numeric data may be used in arithmetic functions or expressions. Only numeric fields may be added to or subtracted from dates.

http://ora-01722.ora-code.com/

업데이트 # 1 :

귀하의 설명이 나를 걱정 :

I am trying to use a subquery that returns a comma delimited string in a IN clause.

y 우리 하위 쿼리는 이 아니야은 쉼표로 구분 된 문자열을 반환해야합니다 (g.group_id이 문자열이고 쉼표로 구분 된 문자열이 필요하지 않은 경우). 필요에 따라 (1,000 개 미만) 필요한만큼의 행에서 개별 항목을 검색해야합니다.

업데이트 # 2 :

SELECT * 
FROM (
    SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL UNION SELECT 3 FROM DUAL 
) FOO; 

FOO_ID     
---------------------- 
1      
2      
3 

당신은이 작업을 수행 할 수 있습니다 :

그냥 명확하게하기

SELECT * 
FROM (
    SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL UNION SELECT 3 FROM DUAL 
) FOO 
WHERE FOO_ID IN (1, 2); 

FOO_ID     
---------------------- 
1      
2 

을하지만이 :

SELECT * 
FROM (
    SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL UNION SELECT 3 FROM DUAL 
) FOO 
WHERE FOO_ID IN ('1,2'); 

SQL Error: ORA-01722: invalid number 

숫자 1과 문자열 '1,2'을 비교할 수 없기 때문입니다. 별명 GROUP_PATH을 참조하기 위해, 당신은 당신이 절하여 주문에 참조하기 전에 별명이 정의 된 중첩 된 하위 쿼리를 사용할 필요가해야, 최소한

SELECT * 
FROM (
    SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL UNION SELECT 3 FROM DUAL 
) FOO 
WHERE FOO_ID IN (
    SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL 
); 

FOO_ID     
---------------------- 
1      
2 

SELECT * 
FROM (
    SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL UNION SELECT 3 FROM DUAL 
) FOO 
WHERE FOO_ID IN (
    SELECT '1,2' AS FOO_ID FROM DUAL 
); 

SQL Error: ORA-01722: invalid number 
+0

하위 쿼리를 쿼리하고 결과를 쉼표로 구분 된 IN 절에 붙여 넣을 때 제대로 작동합니다. 그것에 대한 설명이 있습니까? – Kel

+1

'10, 20, 30 '이라고합시다. 너는 그걸로 무엇을합니까? 'g.group_id IN (10,20,30)'(세 개의 숫자) 또는'g.group_id IN ('10, 20,30 ') (한 문자열)? –

+0

나는 질의를 잘못 작성했다고 생각했다. 그것을 지금 확인하십시오. 나는 group_ids가 아닌 여러 person_ids를 얻으려고합니다. – Kel

2

: 하위 쿼리는 유사한 규칙을 따릅니다. 즉, 현실적으로 ORA-01722 오류의 원인이 아니지만, OTHER 테이블의 PERSON_IDS 열 값의 쉼표로 구분 된 목록 인 경우이 문제

SELECT group_id, group_path 
    FROM (SELECT g.group_id, 
       g.name || '>>' || p.firstname || ' ' || p.lastname as GROUP_PATH 
      FROM PERSON p 
       LEFT JOIN GROUP g ON (
         g.group_id = p.group_id 
       ) 
     WHERE p.person_id IN ( 
       SELECT person_ids FROM other WHERE other_id = :OTHER_ID 
       ) 
ORDER BY lower(GROUP_PATH) 

입니다, 당신의 IN 목록은 당신이 좋겠하지 않을 것입니다 배고 있다. 스칼라 문자열 (쉼표가있는 경우)을 여러 PERSON_ID 값의 모음으로 변환해야합니다. 이 작업을 수행하는 데는 여러 가지 방법이 있습니다. Tom Kyte는 variable IN list을 사용하는 한 가지 예가 있습니다. Tom의 IN_LIST 함수를 복사한다고 가정하면

SELECT group_id, group_path 
    FROM (SELECT g.group_id, 
       g.name || '>>' || p.firstname || ' ' || p.lastname as GROUP_PATH 
      FROM PERSON p 
       LEFT JOIN GROUP g ON (
         g.group_id = p.group_id 
       ) 
     WHERE p.person_id IN ( 
       SELECT column_value 
       FROM TABLE(SELECT in_list(person_ids) 
           FROM other 
          WHERE other_id = :OTHER_ID) 
       ) 
ORDER BY lower(GROUP_PATH) 
+0

귀하의 회신 주셔서 감사합니다 저스틴. 나는 방금 쿼리를 잘못 작성한 것으로 나타났습니다. 쉼표로 구분 된 그룹 ID 문자열을 얻는 대신 쉼표로 구분 된 ID를 얻습니다. – Kel

+0

@Kel - 내 검색어를 일치하도록 수정했습니다. –

관련 문제