2017-07-18 2 views
0

私はHerokuに自分のサイトをアップロードしましたが、コントローラの1つでエラーが発生しました。どうやら私は自分のポストグルコードに構文エラーがあります。これはsqlite3で動作しますが、postgresに変換すると構文エラーが発生しました。sqlite3クエリをpostgresに変換する

@cars=Car.find_by_sql("SELECT cars.*, CASE WHEN EXISTS (SELECT book_cars.* FROM book_cars WHERE book_cars.car_id=cars.id AND book='t') THEN 'TRUE' ELSE 'FALSE' END AS 'is_book' FROM cars WHERE is_book='FALSE'") 

何が原因なのですか? エラーコード:

PG::SyntaxError: ERROR: syntax error at or near "'is_book'" 
+0

''is_book''を' is_book'に変更してみてください。 –

+0

エラーが発生しました:PG :: UndefinedColumn:ERROR: "is_book"列が存在しません – Acrux

+0

'is_book'列が存在することは確かですか? –

答えて

1

は単純試してみてください。

SELECT *, 'FALSE' As is_book 
FROM cars c 
WHERE NOT EXISTS (
    SELECT * FROM book_cars b 
    WHERE b.car_id=c.id AND book = 't' 
) 

をあなたもサブクエリを使用することができます

SELECT * 
FROM (
    SELECT cars.*, 
      CASE WHEN EXISTS (
       SELECT book_cars.* FROM book_cars 
       WHERE book_cars.car_id=cars.id AND book='t') 
      THEN 'TRUE' ELSE 'FALSE' END AS is_book 
    FROM cars 
) x 
WHERE is_book='FALSE'; 

EDIT

を、それを(または「列」)任意の式を見ていない標準SQL WHERE句で

SELECT cars.*, 
     CASE WHEN EXISTS (
      SELECT book_cars.* FROM book_cars 
      WHERE book_cars.car_id=cars.id AND book='t') 
     THEN 'TRUE' ELSE 'FALSE' END AS 'is_book' 
FROM cars 
WHERE is_book='FALSE'; 

SELECT句で宣言:

クエリでの問題は、以下の最後の行にWHERE句ですは、FROM句の表の列のみを表示できます。
is_book句がSELECT句で宣言されているため、WHEREには表示されません。
あなたのようなサブクエリ、使用している場合:

SELECT * 
FROM (--- subquery 
    SELECT some_expression AS new_column 
    FROM .... 
) x 
WHERE new_column = 111 

を、その後、外側のクエリは、その新しい列を見ています。 、WHEREとは対照的に、SELECTレベルで宣言されたカラムを参照し

SELECT cars.*, 
     CASE WHEN EXISTS (
      SELECT book_cars.* FROM book_cars 
      WHERE book_cars.car_id=cars.id AND book='t') 
     THEN 'TRUE' ELSE 'FALSE' END AS 'is_book' 
FROM cars 
HAVING is_book='FALSE'; 

HAVINGので:

またHAVING句を使用することができます。

+0

です。これは本当にありがとうございました。私が尋ねることができるなら、私の質問にはどんな問題がありましたか?私はそれに間違っていたものを見つけることができませんでした。それはSqlite3で働いた。 – Acrux

+1

私は答えを編集しました。理由は 'WHERE'が' SELECT'からの列を見ない理由を説明したものです – krokodilko

+0

ありがとうございました!私はこれから学んだ! :) – Acrux

関連する問題