SQL数组作为预处理语句的参数 - 可移植性

时间:2011-06-03 21:15:45

标签: sql arrays postgresql h2

我正在为我的生产机器使用PostgreSQL,使用H2来进行DAO级别的单元测试,以及针对应用程序级别的Java / JDBC。

我想使用SQL Arrays来实现对数据库的批量查询。但是,两个数据库所期望的语法似乎不同!在Postgres中它是

SELECT * FROM mytable WHERE id=ANY(?)

在H2中,它是

SELECT * FROM TABLE(id CHARACTER VARYING=?) NATURAL JOIN mytable

我认为SQL应该是标准化的!我决定去阅读实际标准,但显然你必须为此付钱......可笑!

我是否错过了另一种可跨数据库移植的方式?

2 个答案:

答案 0 :(得分:1)

标准化?跨数据库的可移植性?哈!你搞笑了。我只遇到PostgreSQL的数组,但Steven表示他们在SQL99中;我不知道哪种语法是标​​准的(我猜PostgreSQL因为它们通常对这些东西很好)但是IN查询应该在任何地方都可以工作:

select * from mytable where id in (?)

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

答案 1 :(得分:0)

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

甚至考虑尝试在所有系统中提出一致的内容,这绝对是一场噩梦。这样做的最佳方法是确保将您正在做的事情限制在这些标准中。而已。如果你超越了它,例如,通过使用聚合函数,你就可以独立完成了。

几个星期前,我想我会尝试实现一个系统,我在dev / test和SQLite中使用PostgreSQL进行单元测试。我认为有一个内存中的SQLite数据库可以帮助我加快我的集成测试。虽然这部分属实,但PostgreSQL和SQLite之间的功能差异引起了许多令人头疼的问题。经过几个不同的事情(我也在使用NHibernate)之后,我放弃了,放弃了这个想法。

故事的寓意?可移植性/标准化并不意味着什么。在你所做的一切事情中保持一致。你会为自己省下多少悲伤。