gpt4 book ai didi

go - 如何构造SELECT * FROM () ORDER BY column;形式的子查询?

转载 作者:IT王子 更新时间:2023-10-29 02:21:17 24 4
gpt4 key购买 nike

我正在使用 gorm 与 postgres 数据库进行交互。我正在尝试 ORDER BY 使用 DISTINCT ON 和 this question 的查询记录如何做到这一点并不那么容易。所以我需要以

的形式结束查询
 SELECT * FROM (<subquery>) ORDER BY column;

乍一看,我似乎需要使用 db.QueryExpr() 将我的查询转换为表达式并围绕它构建另一个查询。然而,似乎 gorm 没有直接指定 FROM 子句的简单方法。我尝试使用 db.Model(expr)db.Table(fmt.Sprint(expr)) 但模型似乎被完全忽略并且 fmt.Sprint( expr) 并没有完全按照我的想法返回。表达式包含一些私有(private)变量。如果我可以将原始查询转换为完全解析的字符串,那么我可以使用 db.Table(query) 但我不确定是否可以在不运行查询的情况下将查询生成为字符串。

如果我有一个完全构建的 gorm 查询,我如何将它包装在另一个查询中以执行我正在尝试执行的 ORDER BY?

最佳答案

如果您想编写将要执行的原始 SQL(包括具有 SQL 子查询的 SQL)并将结果添加到使用 gorm 的对象中,您可以使用 .Raw().Scan() 方法:

query := `
SELECT sub.*
FROM (<subquery>) sub
ORDER BY sub.column;`
db.Raw(query).Scan(&result)

您将指向对象的指针引用传递给 .Scan(),其结构类似于结果行,与您使用 .First() 的方式非常相似。 .Raw() 还可以在查询中使用 ? 将数据添加到查询中,并将值作为逗号分隔的输入添加到函数中:

query := `
SELECT sub.*
FROM (<subquery>) sub
WHERE
sub.column1 = ?
AND sub.column2 = ?
ORDER BY sub.column;`
db.Raw(query, val1, val2).Scan(&result)

有关如何使用 SQL 构建器、.Raw().Scan() 的更多信息,请查看文档中的示例:http://gorm.io/advanced.html#sql-builder

关于go - 如何构造SELECT * FROM (<subquery>) ORDER BY column;形式的子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48549855/

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