2017-07-18 45 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