gpt4 book ai didi

mysql - 在我的 Rails 应用程序中将条件 MySQL 查询语法转换为 Postgres

转载 作者:行者123 更新时间:2023-11-29 12:16:58 29 4
gpt4 key购买 nike

我一直在尝试将 Rails 应用程序中的 mySQL 查询转换为使用 Postgres 语法,并且一直在仔细研究 Postgres 文档,特别是查看条件之间的差异。查询是:

Story.select('*', 'IF (views.id is null, 0, 1) as viewed')
.join('left join views on(
views.story_id = stories.id and views.user_id = ?
)', user.id)
.group(:id)
.order(viewed: :asc)
.order(id: :asc)

或者作为纯粹的查询:

select stories.*,
IF (views.id is null, 0, 1) as viewed
from stories
left join views
on(views.story_id = stories.id and views.user_id = 1)
where 1
group by stories.id
order by viewed, stories.id

似乎 postgres 使用“case”而不是 IF,所以我厌倦了这样的事情:

Story.select('*', '(case when viewid is null then 0, 1 end) as viewed')
.join('left join views on(
views.story_id = stories.id and view.user_id = ?
)', user.id)
.group(:id)
.order(viewed: :asc)
.order(id: :asc)

但是我得到了

参数数量错误(0..1 为 2)

错误...

我尝试了几种变体,但没有成功。我计划在不久的将来进一步研究 SQL,但与此同时,我感到有些迷失。

任何人都可以指出这里不同语法可能是什么的更详细信息吗?谢谢!

最佳答案

EXISTS(...) 产生一个 bool 值,它非常优雅地解决了 NULL 情况:

select s.*
, EXISTS (select 42 from views v
where v.story_id = s.id
and v.user_id = 1) as viewed
from stories s
where 1=1
;

如果您想在 ORDER BY 子句中使用 viewed 列,则必须将上述查询插入子查询中。

关于mysql - 在我的 Rails 应用程序中将条件 MySQL 查询语法转换为 Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29650326/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com