如何将 [] 切片传递给准备好的 SQL 语句中的 IN 条件以及非 IN 条件?

2024-01-13

假设您有以下 SQL 查询:

SELECT *
  FROM foo
  WHERE type = ?
    AND subtype IN (?)

并且您有以下可能的数据(我们想象用户界面可以设置这些数据):

var Type int
var SubTypes []int

如果是SubTypes,我们谈论的是多项选择。

现在,以下代码将不起作用:

rows, err := sqldb.Query(`SELECT *
  FROM foo
  WHERE type = ?
    AND subtype IN (?)`, Type, SubTypes)

因为司机(至少mysql本例中使用的驱动程序 http://github.com/go-sql-driver/mysql) 不认识[]slice。键入以爆炸它(SubTypes...) 也不起作用,因为 A) 你不能有多个分解参数,B) 即使可以,你的 SQL 也只支持一项 ((?)).


准备好的语句不是这样工作的,至少在我所知道的主要 DBMS 中不是这样。我的意思是,在 Go 中,对由以下方法实现的准备好的语句的支持database/sql司机应该使用底层 DBMS 提供的相应设施(如果与其接口的数据库引擎未提供驱动程序可能会选择模拟此类支持)。

现在,在我熟悉的所有 DBMS 中,准备好的语句的整体思想是对其进行处理once由DB引擎并缓存;这里的“处理”意味着语法检查,编译成一些特定于数据库的内部表示并计算出其执行计划。从术语“编译”来看,该语句的text只处理一次,然后每次调用准备好的语句实际上只是告诉服务器“这是我之前提供给您的准备好的语句的 ID,这是用于它包含的占位符的实际参数列表”。这就像编译一个 Go 程序,然后使用不同的命令行标志连续多次调用它。

So the solution you have come up with is correct: if you want to mess with the statement text between invocation then by all means use client-side text manipulations1 but do not attempt to use the result of it as a prepared statement unless you really intend to execute the resulting text more than once.

可能会更清楚:您最初尝试准备类似的东西

SELECT a, b FROM foo WHERE a IN (?)

据说您尝试为此提供一组值时失败IN (?)占位符,因为需要逗号来指定多个值是语法,而不是值的一部分。

我觉得准备一些东西应该还是可以的

SELECT a, b FROM foo WHERE a IN (?, ?, ?)

因为它并没有违反这条规则。并不是说它是适合您的解决方案......

也可以看看this http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-prepare.html and this http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html— 研究后者将允许您直接在 MySQL 客户端中使用准备好的语句。


1 Some engines provide for server-side SQL generation with subsequent execution of the generated text.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 [] 切片传递给准备好的 SQL 语句中的 IN 条件以及非 IN 条件? 的相关文章

  • 如何使用 ALTER TABLE 添加新列并使其唯一?

    我该如何使用ALTER TABLE添加新列并使其独一无二 取决于 DBMS 但我认为以下内容相当可移植 ALTER TABLE table name ADD column name datatype ALTER TABLE table na
  • Wordnet sqlite 同义词和示例

    我正在尝试获取给定 wordid 的同义词和示例列表 经过大量的试验和错误 我可以获得所有同义词集的样本 但不是实际的同义词 这是我的查询 它给出了以下结果 select senses wordid senses synsetid sens
  • 通过字符串操作预防 PHP SQL 注入[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中防止 SQL 注入的最佳方法 https stackoverflow com questions 60174 best way to prevent sql injection in php
  • MySQL解释更新

    作为我大学复习的一部分 我试图回答以下问题 至少在表的一个属性上创建索引 employees 数据库 您可以在其中使用 MySQL EXPLAIN 工具 清楚地显示好处 在条款或检索方面 和负面 在 更新条款 创建相关索引的信息 对于第一部
  • 法语和西班牙语的特殊字符可以保存在 varchar 中吗?

    法语和西班牙语中有普通英语中不使用的特殊字符 重音元音等 varchar 是否支持这些字符 或者我需要一个 nvarchar 吗 注 我愿意NOT希望讨论我是否应该使用 nvarchar 还是 varchar 您在谈论什么 SQL 实现 我
  • oracle lag 函数与 group by

    我有一个查询忽略从前一个值增加的值 例如 采用下表 col1 col2 col3 5 1 A 4 2 A 6 3 A 9 4 B 8 5 B 10 6 B 现在进行以下查询 select col1 from select col1 lag
  • Python 子进程、mysqldump 和管道

    我在尝试构建简单的备份 升级数据库脚本时遇到问题 错误出现在使用子进程的 mysqldump 调用中 cmdL mysqldump user db user password db pass domaindb gzip gt databas
  • VIEW for 表结合 UNION ALL 的 MySQL 性能

    假设我有 2 张桌子MySQL create table persons id bigint unsigned not null auto increment first name varchar 64 surname varchar 64
  • 在bigquery中比较两个表的有效方法

    我有兴趣比较两个表是否包含相同的数据 我可以这样做 standardSQL SELECT key1 key2 FROM SELECT table1 key1 table1 key2 table1 column1 table2 column1
  • MySQL 将表的校验和存储在另一个表中

    语境 我们有包含大量表的大型数据库 他们中的大多数 99 都使用innodb 我们希望有一个日常流程来监视哪个表已被修改 当他们使用 innodb 的值时Update time from SHOW table STATUS from inf
  • 使用显式值进行 BigQuery 合并

    据我所知 BigQuery 支持合并两个表 目前 INSERT操作允许将显式值插入表中 例如 INSERT dataset Inventory product quantity VALUES top load washer 10 front
  • 尚未为此带有 SQL Server 的 DbContext .NET Core 配置数据库提供程序

    我一直用这个把头撞在墙上 并且一直在谷歌上搜索无济于事 我刚刚开始一个新的 ASP NET Core MVC 项目 我已将这两个包安装 更新为 2 2 0 Microsoft EntityFrameworkCore SqlServer Mi
  • If Else 条件的 SQLite 语法

    我正在使用 SQLite 数据库 我的表有一个名为 密码 的文本列 早些时候 为了检索我用来执行简单操作的值select from myTable询问 但现在的要求是 如果Password值不是NULL那么我需要将其显示为 是 或 否 它是
  • 常量值如何影响连接的 ON 子句?

    我最近发现 LEFT JOIN 的 ON 子句可能包含 1 1 等值 这让我感到不安 因为它打破了我对连接功能的看法 我遇到过以下情况的更详细版本 SELECT DISTINCT Person ID FROM Person LEFT JOI
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 如何限制两个表之间一对多关系中的多个数量?

    我有一个带有两个 MySql 表的 MySQL 数据库 第一个是第一个表 表 A 有一列具有唯一值 从值 从 1 到 n 在第二个表 2 表 B 中 我有两列 在第一个表中我有一个名称 在第二个我的值从 1 到 n 如果我在 中添加一个值
  • 如何更新 MySQL 数据库中的两列?

    这不起作用 UPDATE customers SET firstname John AND lastname Smith WHERE id 1 用逗号分隔值 AND是一个逻辑运算符 它的位置是WHERE and ON条款 UPDATE cu
  • 无法将句子插入数据库

    我有一些句子 我必须选择由 6 个以上单词组成的句子 然后它们将被插入到数据库中
  • SQLite 中的累积求和值

    我正在尝试在 SQLite 中执行值的累积和 我最初只需要对一列求和并获得代码 SELECT t MyColumn SELECT Sum r KeyColumn1 FROM MyTable as r WHERE r Date lt t Da
  • Postgresql:SERIAL 在约束 INSERT 失败时递增

    有一个像这样的简单表结构 CREATE TABLE test id INT PRIMARY KEY sid SERIAL 我注意到如果我尝试插入一行但它未通过约束测试 即主键约束 SERIAL计数器无论如何都会增加 所以下一次成功插入 si

随机推荐