尝试简单:
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
级别定义的字段。
尝试将''is_book''更改为'is_book'(不含''')。 –
我试着这样做,然后错误成为:PG :: UndefinedColumn:错误:列“is_book”不存在 – Acrux
你确定'is_book'列确实存在吗? –