2010-05-18 7 views
2

나는 쿼리를 가지고포스트 그레스 열 주조

일을하고 나는 인용을 유의하시기 바랍니다가

SELECT assetid, type_code, version, name, short_name, status, languages, 
charset, force_secure, created, created_userid, updated, updated_userid, 
published, published_userid, status_changed, status_changed_userid 
FROM sq_ast WHERE assetid = '7' 

을 수행하여 작동시킬 수

ERROR: operator does not exist: character varying = integer LINE 4: FROM sq_ast WHERE assetid = 7 

가 발생하지 않습니다

SELECT assetid, type_code, version, name, short_name, status, languages, 
charset, force_secure, created, created_userid, updated, updated_userid, 
published, published_userid, status_changed, status_changed_userid 
FROM sq_ast WHERE assetid = 7 

WHERE 절의 7 개 중 ...

거대한 응용 프로그램을 배포하고 코어를 다시 작성할 수 없습니다 ... 마찬가지로 열의 유형을 변경하지 않으려 고합니다.

저는 Postgres 전문가가 아닙니다. .. 도와주세요 ..

열을 엄격하게 캐스팅하는 옵션이 있습니까 ???

+0

어떤 PostgreSQL 버전입니까? 빠른 테스트는 8.4가 이것을 허용한다는 것을 암시합니다. – araqnid

답변

6

Postgresql은 최근 버전에서 더욱 강력하게 입력되었으며, 좋은 점입니다. assetid이 VARCHAR이면 정수로 비교할 수 없습니다 (8.4부터, 나는 믿는다).

일반적으로 (PostgreSQL뿐만 아니라 데이터베이스 디자인뿐만 아니라) 이러한 유형을 혼합하는 것은 좋지 않습니다. 숫자 데이터 유형은 숫자로 구성되는 문자열이 아닌 실제 숫자 필드에 사용해야합니다.

예를 들어 인보이스 "번호"또는 신용 카드 번호는 일반적으로 "숫자"로 표시되어서는 안되며 문자열로 표시되어서는 안됩니다.

경우에 따라 결정이 명확하지 않을 수도 있습니다 (예 : 문서 번호).

도움이되는 몇 가지 기준 :

  • 는 당신에게 당신의 가치와 산술하고 잠재적 의향이 있습니까 (합계, 빼기)? 그것은 적어도 이해가 되겠습니까? 그런 다음 number입니다.

  • 왼쪽의 이 0이어야합니까? 아니면 관련이 있다고 생각합니까? ('07'은 '7'과 다른 것으로 간주됩니까?) 그러면 string입니다.

당신이 당신의 시나리오에서 이러한 질문 anwser 방법에 따라하기 (0으로 시작하는 자산 ID가? 어떤 숫자가 아닌 문자가있을 수 있습니다 일련 번호로 보이는가? 거기에) 당신을 고려해 볼 수 있습니다 선호하는 방향으로 캐스팅 할 (시나리오에 더 많은 가능성) 필드 유형 또는 변경 :

SELECT... FROM sq_ast WHERE assetid::integer = 7 

을 다른 곳

SELECT... FROM sq_ast WHERE assetid = '7' 

또는 (당신은 필드가 숫자 인 것을 결정하는 경우) 이전 동작으로 되돌리려면 전역 설정이 없으며 문자 유형 AFAIK에 대한 암시 적 캐스트를 강제 수행하십시오.

+0

"이전 답변으로 되돌리기위한 전역 설정이 없습니다."- [다른 대답은 여기에 있습니다] (http : // stackoverflow.co.kr/a/18129968/243245)를 사용하면 암시 적 캐스트 기능을 만들어 이전 동작을 모방 할 수 있습니다. [PostgreSQL wiki의 스크립트] (http://wiki.postgresql.org/wiki/Image:Pg83-implicit-casts.sql)를 사용하십시오. – Rup