Ruby on rails 将sqlite3查询转换为postgres
我刚刚把我的网站上传到Heroku,但是我的一个控制器出现了一个错误。显然我的postgres代码有语法错误。这在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 '
@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