假设您有以下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
在本示例中使用的驱动程序)无法识别[]slice
。键入使其爆炸(SubTypes...
)也不起作用,因为A)您不能有多个爆炸参数,而B)即使可以,您的SQL仅支持单个项目((?)
)。
准备的语句不能那样工作,至少在我所知的主要DBMS中不行。我的意思是,在Go中,由database/sql
驱动程序实现的对准备好的语句的支持 应该
使用底层DBMS提供的相应功能(如果驱动程序所接口的DB引擎未提供,则驱动程序可能会选择模拟这种支持)。
现在,在我熟悉的所有DBMS中,prepared语句的整体思想是,它由DB引擎处理 一次
并缓存;这里的“已处理”是指语法检查,编译为某些特定于数据库的内部表示形式,并确定其执行计划。从术语“已编译”开始,语句的 文本
仅被处理一次,然后每次对预处理语句的调用实际上只是告诉服务器“这是我之前提供给您的预处理语句的ID,这是实际的列表。用于包含的占位符的参数”。这就像编译Go程序,然后使用不同的命令行标志连续多次调用它。
因此,您想出的解决方案是正确的:如果您想在调用之间弄乱语句文本,则一定要使用客户端文本操作1,但不要尝试将其结果用作准备好的语句,除非您真的打算多次执行结果文本。
而且可能会更清楚:您最初尝试准备类似
SELECT a, b FROM foo WHERE a IN (?)
据说您尝试为该IN (?)
占位符提供一组值失败了,因为在那里指定多个值所需的逗号 是语法,而不是值的一部分。
我认为准备类似的东西还是可以的
SELECT a, b FROM foo WHERE a IN (?, ?, ?)
因为它不会违反该规则。并不是说这是您的解决方案……
另见本和本 -学习后者将让你与准备语句直接在MySQL客户端播放。
1一些引擎提供服务器端SQL生成,并随后执行生成的文本。
我的目标是:我需要从表1中检索name2),但是我还需要检索具有相同名字的人的状态(在本例中是statusY)。注意,对于name2的检索,我不能依赖于json对象的索引(name2可能是json对象的第一个键)。 到目前为止,我将如何做到这一点:A)在第一个查询中从表1中获取name2),对其进行清理,以及B)在第二个查询中使用它,然后正确地检索状态 语句A)和B)都是参数化的准备好的sql语句
问题内容: 谁能告诉我两列中SQL中NOT IN条件的确切语法。 这是我用VBA编写的查询。 我想更改此子查询,它应应用于两列的组合,如下所示: 但这不起作用..... 问题答案: 您不能使用多于一列,但通常可以使用以下方法实现相同的效果:
问题内容: 使用的bson功能创建查询时遇到了一些麻烦。我只是想做,但是我不知道怎么做。 我有一个s,并尝试直接传递它: 我看到了另一条建议使用的帖子,但这也不起作用: 我在这里和gh上浏览了他的文档和其他问题,但是大多数涉及切片的问题似乎都是关于将数据分成一个切片,而不是我想要达到的目的。 非常感激任何的帮助。 问题答案: 您最初的建议(通过值)没有缺陷,这样做是有效的。 问题是您使用它来查找和
问题内容: 我通过执行查询得到。这必须传递给 IN 子句值的另一个查询。如何通过 HQL ? 我们可以转换到并且可以通过它,这不是一个问题。 最后,我必须将列表以或或形式传递给 IN 子句。 问题答案: 要么
问题内容: 可以说我有一个SP,其语句如下: 但是数据必须通过包含值字符串的单个变量到达该子句。以下内容链接 但是它不能那样工作。任何想法如何做到这一点? 问题答案: 像这样传递参数值- 。然后,使用FIND_IN_SET函数就足够了-
问题内容: 我的目的是在表中找到与存储在String中的集合匹配的所有项目: 这似乎并不完美,它总是向我发出以下警告: 如果我有一个参数,这将是显而易见的: 但是由于我不得不处理这个问题,这对我来说有点复杂。 问题答案: Prepared语句没有参数,因为您在准备列表之前已将列表插入到该语句中。 至此,您创建的SQL语句为: 由于该语句没有参数,因此失败。而不是将项目插值到语句(容易注入)中,而是