2011-01-20 2 views
4

로컬 SQLite로 개발 중이지만 프로덕션 호스트에서 PostgreSQL을 실행하고 있습니다. 로컬에서는 모든 것이 정상이지만 프로덕션 호스트에서는 그렇지 않습니다.PGError : ERROR : 연산자가 존재하지 않습니다 : 부울 ~~ * 알 수 없음

필자가 원하는 모든 조합으로 데이터베이스의 모든 데이터를 평가할 수있는 검색 양식을 만들었습니다. 이것은 부울 및/또는 날짜 필드를 사용하지 않는 한 제대로 작동하는 것 같습니다. 왜 어쨌든있어

unless params[:analysis][:sporty].blank? 
    tmp_conditions_customer << ["(sporty ILIKE ?)", "%#{params[:analysis][:sporty]}%"] 
end 

SELECT COUNT(*) FROM "customers" WHERE ((sporty ILIKE '%%') 

로 평가 PostgreSQL은

그래서, 여기에 몇 가지 예제 코드입니다 ... 아주 많이 내 코드를 같이하지 않는 것? 왜 '%%'?

배포 테스트를 위해 Exceptional 플러그인과 함께 Heroku를 사용하고 있습니다.

HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

덕분에 뛰어난, 그러나 그것은 도대체 무엇을 의미 하는가 :이 플러그인은 나에게 다음 힌트를 준다? : - D SQL 쿼리를위한 캐스트? 그게 어떻게 효과가 있니? 내 마이그레이션에서

는 데이터베이스 필드는 다음과 같습니다 :이 데이터를 만드는거야

t.boolean :sporty 

그리고 형태

가이 코드

이미 언급 한 바와 같이
<%= f.label :sporty %><br /> 
<%= f.select :sporty, options_for_select({ "Ja" => true, "Nein" => false }), { :include_blank => '-----'} %> 

을 사용하고, SQLite는 내 친구 다. 문제를 일으키는 PostgreSQL에 대한 훨씬 더 엄격한 평가 인 것 같다.

미리 도움을 주셔서 감사합니다.

답변

4

직접 대답이 아래쪽에 있습니다. . .

This evaluates to

SQL에서
SELECT COUNT(*) FROM "customers" WHERE ((sporty ILIKE '%%') 

Why’s that anyway? Why the '%%'?

는 '%'는 와일드 카드입니다. 하지만 문제는 두 개의 여는 괄호가있는 WHERE 절을 작성하는 것 인 것처럼 보입니다. 단 하나의 닫는 괄호 만 닫는 것입니다. 이 같은 절은 아마 반환 (또는 계산)한다

모든 행 :

WHERE (sport ILIKE '%%') 

Type casts for SQL queries? How’s that gonna work?

표준 SQL은 CAST() 함수를 가지고있다. 해골 구문은 따라서 예를 들어, 당신은 날짜 데이터 형식에 타임 스탬프를 변경

CAST (<any timestamp> AS DATE) 

를 작성할 수

CAST (expression AS type) 

, 또는

CAST ('32' AS INTEGER) 

은 문자열 '32'을 변경하려면 정수 32로 변환합니다.

t.boolean :sporty 

"스포티"열이 부울 경우

In my migration the database field looks like this:

, 이것은 당신의 진짜 문제입니다. 부울에 문자열 비교를 사용하려고하면 (예 : WHERE (스포티 한 ILIKE '%%')) 오류 메시지가 나타납니다. 다음과 같이 문장을 읽으십시오.

답변에 대한
SELECT COUNT(*) FROM "customers" WHERE sporty; 
SELECT COUNT(*) FROM "customers" WHERE sporty = true; 

또는

SELECT COUNT(*) FROM "customers" WHERE NOT sporty; 
SELECT COUNT(*) FROM "customers" WHERE sporty = false; 
+0

감사합니다 :-). 그에 따라 내 검색어가 수정되었습니다. 하지만 이제이 오류가 발생합니다 : PGError : 오류 : 부울 입력 유형이 잘못되었습니다 : "". 지금 뭐야? :/ –

+0

@ulf : 새로운 SQL 문은 무엇입니까? –

+0

새로운 문장은 다음과 같습니다 : "sporty =?" "away"를 남겨두면 응용 프로그램이 손상됩니다. –

관련 문제