Golang中如何使用db.Exec实现Insert时添加where not exists条件

Golang中如何使用db.Exec实现Insert时添加where not exists条件 这个语句可以正常工作,所以我知道我的连接字符串等配置是好的:

result, err = db.Exec("INSERT INTO [dbo].[Priority] ([Priority_SHA256])  VALUES ($1), string(cfg.General.PrioritySHA256[:]))

但是当我添加 WHERE NOT EXISTS 子句时,我无法弄清楚如何替换值(请参见下面加粗的部分):

result, err = db.Exec(“INSERT INTO [dbo].[Priority] ([Priority_SHA256])  VALUES ($1) WHERE NOT EXISTS ( SELECT ‘x’ FROM [dbo].[Priority] WHERE [Priority_SHA256] = **string(cfg.General.PrioritySHA256[:])**)”, string(cfg.General.PrioritySHA256[:]))

连接的是 SQL Server 数据库。


更多关于Golang中如何使用db.Exec实现Insert时添加where not exists条件的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

我尝试过并且也这么做了,但在遇到第一个“WHERE”时报错了。

错误:(16, 556) 应为 ,却得到了 ‘WHERE’

更多关于Golang中如何使用db.Exec实现Insert时添加where not exists条件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你的意思是:

INSERT INTO [dbo].[Priority] ([Priority_SHA256]) VALUES ($1) WHERE NOT EXISTS ( SELECT ‘x’ FROM [dbo].[Priority] WHERE [Priority_SHA256] = $1)

stackoverflow.com

Francisco Carvalho

SQL Server Insert if not exists

标签: sql, sql-server, sql-server-2008, stored-procedures

在Golang中使用db.Exec实现INSERT时添加WHERE NOT EXISTS条件,你需要将查询参数正确传递到SQL语句中。对于SQL Server,可以使用@p1作为参数占位符,而不是$1

以下是正确的实现方式:

query := `
INSERT INTO [dbo].[Priority] ([Priority_SHA256]) 
SELECT @p1
WHERE NOT EXISTS (
    SELECT 1 
    FROM [dbo].[Priority] 
    WHERE [Priority_SHA256] = @p1
)`

result, err := db.Exec(query, string(cfg.General.PrioritySHA256[:]))
if err != nil {
    // 处理错误
}

或者使用?作为参数占位符(取决于你的SQL Server驱动):

query := `
INSERT INTO [dbo].[Priority] ([Priority_SHA256]) 
SELECT ?
WHERE NOT EXISTS (
    SELECT 1 
    FROM [dbo].[Priority] 
    WHERE [Priority_SHA256] = ?
)`

result, err := db.Exec(query, 
    string(cfg.General.PrioritySHA256[:]), 
    string(cfg.General.PrioritySHA256[:]))
if err != nil {
    // 处理错误
}

如果你使用的是github.com/denisenkom/go-mssqldb驱动,也可以这样写:

query := `
IF NOT EXISTS (SELECT 1 FROM [dbo].[Priority] WHERE [Priority_SHA256] = @p1)
BEGIN
    INSERT INTO [dbo].[Priority] ([Priority_SHA256]) 
    VALUES (@p1)
END`

result, err := db.Exec(query, sql.Named("p1", string(cfg.General.PrioritySHA256[:])))
if err != nil {
    // 处理错误
}

检查受影响的行数:

rowsAffected, err := result.RowsAffected()
if err != nil {
    // 处理错误
}
fmt.Printf("插入了 %d 行\n", rowsAffected)

关键点是确保WHERE子句中的参数也使用相同的参数占位符,并在db.Exec调用中提供相应的参数值。

回到顶部