我正在为我的生产机器使用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应该是标准化的!我决定去阅读实际标准,但显然你必须为此付钱......可笑!
我是否错过了另一种可跨数据库移植的方式?
答案 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)之后,我放弃了,放弃了这个想法。
故事的寓意?可移植性/标准化并不意味着什么。在你所做的一切事情中保持一致。你会为自己省下多少悲伤。