如何以SELECT * FROM(<subquery>)ORDER BY列的形式构造子查询;?

时间:2018-01-31 19:18:41

标签: go go-gorm

我正在使用gorm与postgres数据库进行交互。我正在尝试通过使用DISTINCT ON和this question文档的查询进行ORDER BY,以了解如何做到这一点并不容易。所以我需要以

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

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

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

1 个答案:

答案 0 :(得分:0)

如果要编写将要执行的原始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