2016-11-15 7 views
0

나는 사람들의 테이블을 가지고 있습니다. 각 사람은 여러 개의 레지스트리를 가질 수 있습니다 (대부분 정수이지만 일부는 M/2344 및 W345와 유사합니다). 상황을 좀 더 복잡하게 만들기 위해 NULL, 빈 공간 및 'NA'와 같은 문자열이 있습니다. 예기치 않은 구성으로 인해 Regnum은 텍스트 배열 필드 (예 : {12345, M/2344} 및 {3459, NA})에 저장됩니다. 대부분의명는 정수로 처리 할 수 ​​regnums이PostgreSQL 텍스트 배열 - 정수로 쿼리 (숫자 제외)

때문에 491555 및 491685. 나 '

, 말, 사이 regnum로 사람을 찾을처럼, 나는이 분야에 일을 할 수 있도록하고 싶습니다 해봤 :

SELECT id,forename,surname,regnum FROM (SELECT *, unnest(regnum) reg FROM people) as TBL WHERE reg BETWEEN '491555' AND '491685';

하지만 결과는 범위를 벗어난 regnums, 예를 들면 포함 49162.이 나는 중첩되지 regnum 필드가 여전히 텍스트 필드이기 때문에이 가정

또한 정수 필드로 regnum 캐스팅 시도했습니다 I - unnest(regnum::integer[]) - 그러나 나는 오류를 얻을 (?) : Error in query: ERROR: invalid input syntax for integer: "NA"

I을 내가 올바른 방향으로 가고 있다고 생각하지만, 비 int와 같은 regnum을 무시하는 법을 모르겠다. 어떤 아이디어?

+0

postgresql에이 기능이 있는지는 잘 모르겠지만, 숫자 인 경우 열의 값이 테스트되는 select의 일부로 'CASE'를 테스트하려고합니다. 그렇다면 return 그렇지 않으면 매우 큰 숫자를 반환합니다 (범위에 포함되지 않거나 다른 제외 값). 이자형). – FDavidov

+0

감사합니다. @FDavidov. 나는 그것이 CASE에 올 것이라고 생각했다. 그러나 나는 그것을 올바르게 이해할 수 없었다. – Greg

답변

0

텍스트 값이이 같은 정규 표현식을 확인하여 숫자로만 구성되어 있다면 당신은 테스트 할 수

SELECT '1234' ~ '^[0-9]+$' -- true 
SELECT 'NA' ~ '^[0-9]+$' -- false 

따라서, 귀하의 경우에는 당신이 수치 경우에만 정수로 값을 캐스팅해야합니다

WHERE (CASE WHEN reg ~ '^[0-9]+$' THEN reg::integer ELSE null END) BETWEEN 491555 AND 491685 
+0

완벽! 나는 문자 그대로 복사/붙여 넣기를하고 치료를했습니다. @pumbo에 감사드립니다. – Greg