SQL数组作为准备语句的参数-可移植性

SQL数组作为准备语句的参数-可移植性,sql,arrays,postgresql,h2,Sql,Arrays,Postgresql,H2,我正在为我的生产机器使用PostgreSQL,在DAO级别sane上使用H2进行单元测试,在应用程序级别使用Java/JDBC 我想使用SQL数组实现数据库的批量查询。但是,这两个数据库所期望的语法似乎不同!在博士后是这样的 SELECT * FROM mytable WHERE id=ANY(?) 在H2中,它是 SELECT * FROM TABLE(id CHARACTER VARYING=?) NATURAL JOIN mytable 我以为SQL应该标准化!我决定去读实际的标准,但

我正在为我的生产机器使用PostgreSQL,在DAO级别sane上使用H2进行单元测试,在应用程序级别使用Java/JDBC

我想使用SQL数组实现数据库的批量查询。但是,这两个数据库所期望的语法似乎不同!在博士后是这样的

SELECT * FROM mytable WHERE id=ANY(?)
在H2中,它是

SELECT * FROM TABLE(id CHARACTER VARYING=?) NATURAL JOIN mytable
我以为SQL应该标准化!我决定去读实际的标准,但显然你必须为此付钱。。。可笑


我是否缺少另一种跨数据库移植的方式?

标准化?跨数据库的可移植性?哈你做了一个有趣的决定。我只见过使用PostgreSQL的数组,但Steven指出它们在SQL99中;我不知道哪种语法是标准的(我猜PostgreSQL,因为它们通常对这些东西都很在行),但IN查询在任何地方都应该工作得差不多:

select * from mytable where id in (?)

您将在占位符中使用以逗号分隔的
id
值列表,并且您必须注意
id
s列表的大小(当然,该大小将是特定于数据库的)。

标准化了吗?跨数据库的可移植性?哈你做了一个有趣的决定。我只见过使用PostgreSQL的数组,但Steven指出它们在SQL99中;我不知道哪种语法是标准的(我猜PostgreSQL,因为它们通常对这些东西都很在行),但IN查询在任何地方都应该工作得差不多:

select * from mytable where id in (?)

您将在占位符中使用以逗号分隔的
id
值列表,并且您必须注意
id
s列表的大小(当然,该大小将是特定于数据库的)。

在数据库系统中存在某些一致的标准。在许多情况下,这是实施的基准。然后,每个系统都以自己的方式建立在这些标准的基础上

甚至想到要想出在所有系统中都是一致的东西,这绝对是一场噩梦。做到这一点的最佳方法是确保将您所做的限制在这些标准中。没别的了。例如,如果你超越了这一点,通过使用聚合函数,你就只能靠自己了

几周前,我想我应该尝试实现一个系统,在dev/test中使用PostgreSQL,在单元测试中使用SQLite。我认为拥有一个内存中的SQLite数据库可以帮助我加快集成测试的速度。虽然这一部分是正确的,但PostgreSQL和SQLite之间在功能上的差异造成了许多令人头痛的问题。在经历了几件不同的事情之后(我也在使用NHibernate),我放弃了这个想法


这个故事的寓意是什么?可移植性/标准化并不重要。在你所做的每件事中都要保持一致。你会省去很多痛苦。

在数据库系统中有一些标准是一致的。在许多情况下,这是实施的基准。然后,每个系统都以自己的方式建立在这些标准的基础上

甚至想到要想出在所有系统中都是一致的东西,这绝对是一场噩梦。做到这一点的最佳方法是确保将您所做的限制在这些标准中。没别的了。例如,如果你超越了这一点,通过使用聚合函数,你就只能靠自己了

几周前,我想我应该尝试实现一个系统,在dev/test中使用PostgreSQL,在单元测试中使用SQLite。我认为拥有一个内存中的SQLite数据库可以帮助我加快集成测试的速度。虽然这一部分是正确的,但PostgreSQL和SQLite之间在功能上的差异造成了许多令人头痛的问题。在经历了几件不同的事情之后(我也在使用NHibernate),我放弃了这个想法


这个故事的寓意是什么?可移植性/标准化并不重要。在你所做的每件事中都要保持一致。你会省去很多痛苦。

一些网站声称数组在SQL99中标准化,并在SQL2003中扩展,因此不是Postgres的扩展。也就是说,您的语法确实有效。谢谢:-)@Steven:我只在PostgreSQL中见过数组,不知道它们在最近的标准中。也就是说,我发现数据库比web浏览器和C编译器更落后于标准:)真不敢相信我错过了语法。但愿我能读一下《标准》找到答案!:-p谢谢。事实上,这是行不通的!它尝试将数组值视为标量并检查相等性,即id=“1,2,3”,这不是我想要的结果。:/它只是碰巧为一个值工作…@史蒂文:不知道你的意思。是不是有什么东西在背后把你的
变成了
=
?一些网站声称数组在SQL99中是标准化的,在SQL2003中是扩展的,因此不是Postgres的扩展。也就是说,您的语法确实有效。谢谢:-)@Steven:我只在PostgreSQL中见过数组,不知道它们在最近的标准中。也就是说,我发现数据库比web浏览器和C编译器更落后于标准:)真不敢相信我错过了语法。但愿我能读一下《标准》找到答案!:-p谢谢。事实上,这是行不通的!它尝试将数组值视为标量并检查相等性,即id=“1,2,3”,这不是我想要的结果。:/它只是碰巧为一个值工作…@史蒂文:不知道你的意思。是不是有什么东西在你背后把你的
变成了
=
?好吧,我想只要我坚持不太疯狂的事情,我就没事了。我有上面提到的语法。好吧,我想只要我坚持做一些不太疯狂的事情,我会没事的。我得到了上面的语法。