2017-07-18 61 views
0

我剛將我的網站上傳到Heroku,但是在我的一個控制器中出現錯誤。顯然,我有我的postgres代碼語法錯誤。這在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:錯誤:列「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'; 

編輯


在您的查詢的問題是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'; 

在標準的SQL WHERE條款沒有看到任何表達(或「列」)的SELECT子句中聲明,它只能查看FROM子句中的表中的列。
is_book列在SELECT子句中聲明,因此WHERE看不到它。
如果您使用子查詢,如:

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

再查詢外層看到新列。

您還可以使用HAVING條款:

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,而相比之下,WHERE,確實看到在SELECT級別定義的字段。

+0

這工作非常感謝你。如果我問,我的查詢有什麼問題?我找不到它有什麼問題。它在Sqlite3中工作。 – Acrux

+1

我編輯了答案,附加了一個解釋爲什麼WHERE沒有看到來自SELECT的列 – krokodilko

+0

非常感謝!我從中學到了! :) – Acrux