Ruby on rails 将sqlite3查询转换为postgres

Ruby on rails 将sqlite3查询转换为postgres,ruby-on-rails,postgresql,heroku,sqlite,Ruby On Rails,Postgresql,Heroku,Sqlite,我刚刚把我的网站上传到Heroku,但是我的一个控制器出现了一个错误。显然我的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 '

我刚刚把我的网站上传到Heroku,但是我的一个控制器出现了一个错误。显然我的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'"
试试简单的方法:

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
中,其中
子句未看到在
SELECT
子句中声明的任何表达式(或“列”),它只能看到
from
子句中表中的列。
is\u 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';

因为
拥有
,与
中的
相反,确实可以看到在
选择
级别声明的列。

尝试将
'is_book'
更改为
is_book
(没有
)。我尝试了这样做,然后错误变成:PG::undinedcolumn:error:column“is_book”不存在是否确定列
是否存在?列book是否存在。(t.boolean“book”)在我的开发阶段,它在sqlite3中工作。该错误发生在我的制作阶段的postgres中。请澄清,该列的名称是
book
is_book
?如果您在postgres db上运行->
从您的表中选择is_book
,运行正常吗?非常感谢。如果我可以问一下,我的问题是什么?我找不到它有什么毛病。它在Sqlite3中起作用。我编辑了答案,附加了一个解释,解释了为什么
WHERE
看不到
SELECT