sql - 如何使用Go在postgres中将等于(=)更改为不等于(<>)

标签 sql string postgresql go

我有两个非常相似的SQL查询。唯一的区别是,在WHERE子句之一中,我使用的是等于(=)而不是不等于(<>)。有没有办法以一种优雅的方式以编程方式修改查询?我正在寻找这样的东西:

func getEvents(name string, exclude bool) {
    q := `SELECT * FROM events WHERE name`
    if exclude {
        q = q + " <> "
    } else {
        q = q + " = "
    }
    q = q + "$1"

    result, err := DBQuery(q, name)
    ...
}

最佳答案

一种优雅的方法是为运算符创建类型和常量:

type Op string

const (
    OpEqual       Op = "="
    OpNotEqual    Op = "<>"
    OpLessThan    Op = "<"
    OpGreaterThan Op = ">"
    // ... any other ops you need
)
然后构建查询字符串是一个简单的字符串连接:
q := "SELECT * FROM events WHERE name" + op + "$1"
或者您可以使用 fmt.Sprintf() :
q := fmt.Sprintf("SELECT * FROM events WHERE name %s $1", op)
当然,将getEvents()的签名更改为:
func getEvents(name string, op Op)
现在,调用getEvents()更好:
getEvents("error", OpEqual)
getEvents("error", OpNotEqual)
尝试在Go Playground上的示例。

关于sql - 如何使用Go在postgres中将等于(=)更改为不等于(<>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64226991/

相关文章:

sql - PostgreSQL 是否会短路其 BOOL_OR() 评估?

postgresql - 在 PostgreSQL 之上实现区间分析

sql - 在 Oracle SQL 中合并两个字符串

python - 根据特定子字符串的索引对字符串列表进行排序

json - 检查 Postgres 中 JSON 值的值类型

mysql - 如何使 Sequelize 使用单数表名

c - 打印txt文件的校验和而不打印文件路径

sql - ISNULL、IIF、CASE 语句中的子查询

c# - 并非所有代码路径在循环时都返回值

sql - 为什么保存数据会导致无效字段“ERROR_CODE”的无效值?