跨平台检查 SQL 中是不是存在“DUAL”表的方法

Posted

技术标签:

【中文标题】跨平台检查 SQL 中是不是存在“DUAL”表的方法【英文标题】:Cross-platform way to check if "DUAL" table exists in SQL跨平台检查 SQL 中是否存在“DUAL”表的方法 【发布时间】:2021-07-21 23:55:53 【问题描述】:

我有一个可以使用 Oracle、mysql 或 SQL Server 的应用程序。在一些查询中,我需要使用“DUAL”表,例如:

SELECT (CASE WHEN EXISTS (SELECT 1 FROM MYTABLE) THEN 1 ELSE 0 END) FROM DUAL

但是,SQL Server 不支持“DUAL”表。

是否有我可以使用的 SQL 语句来检查“DUAL”表是否受支持?这样,如果不支持,我可以分支到不同的查询。

我尝试查询 INFORMATION_SCHEMA.TABLES,但那里没有列出“DUAL”表,即使在支持它的 Oracle 和 MySQL 中也是如此。

【问题讨论】:

正如表格不标准一样,检查哪些表格存在的语法也不标准。许多其他函数、表达式等的语法也不是。因此,您的 SQL 语句应该已经针对您运行的平台进行了定制(不仅仅是使用 DUAL)。为什么您的应用程序代码还不知道服务器是什么平台?这感觉就像您试图从一个更大的问题中解决一个较小的细节。 @MatBailie 我的应用程序确实知道该平台,但我想让数据库告诉我是否支持 DUAL,这样如果我支持另一个数据库,我就不必修改我的代码。 但是无论如何您都必须修改代码,因为每个平台上的检查本身都会不同。 if 或 switch 有什么问题?如果你知道它是 MySQL 或 Oracle,你知道你可以使用dual,否则你不能,除非它是手动创建的。 @TheImpaler 我从来没有说过“我的应用程序不知道平台”。你看错了。 编写可在多个品牌的 RDBMS 产品之间移植的 SQL 代码在很大程度上是一个神话。我实现了一个支持 Oracle、Microsoft、DB2、MySQL、PostgreSQL 和 SQLite 的数据库库。最终必须编写一个适配器模式,并为每个品牌定制 SQL。 【参考方案1】:

最好的办法是在 SQL Server 中创建一个dual 表或视图,其中包含一行。 MySQL 接受dual

做一次就忘了。

【讨论】:

虽然这可行...我希望有一个更干净的解决方案,不需要创建一个空表 @user3163495 。 . .如果您想编写可在三个数据库之间移植的任何代码,建议您这样做。当然,你能表达的东西还是会很有限,但至少会有一些疑问。 表示您不想创建空表:好吧,在 Oracle 中,dual 包含 一行,它不是t 为空。如果有人删除它,很多 Oracle 代码都会中断。因此,是的,我同意 Gordon 的观点:create table dual (dummy char(1)); insert into dual values ('X'); 并忘记它。

以上是关于跨平台检查 SQL 中是不是存在“DUAL”表的方法的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Dual 表详解

Oracle虚表

如何在SQL Server2005数据库中检查一个表是不是存在,如存在就删除表记录,如不存在就建表.

oralce中的dual详解 转 http://blog.sina.com.cn/s/blog_a5a24bcb0100zeay.html

Oracle中dual表的用途介绍

SQL函数检查日期是不是在另一个表的2个日期之间