SQL 在 SQL Server 和 Oracle 中返回固定数据
Posted
技术标签:
【中文标题】SQL 在 SQL Server 和 Oracle 中返回固定数据【英文标题】:SQL to return fixed data in both SQL Server and Oracle 【发布时间】:2011-09-13 11:25:38 【问题描述】:我需要一个通用的选择语句,它返回一个固定的值/行而不需要表,它必须与 Oracle 和 Sql Server 一起使用。
例如对于 Oracle,我知道我可以使用:
select 'O' AS INDICATOR from DUAL;
但这在 Sql Server 上不起作用。
这可以在 Oracle 和 SQL Server 上使用相同的 SQL 完成吗?
【问题讨论】:
您是否正在编写适用于两种数据库的数据层? 好久没用oracle了,select * from (select 'O' as Indicator) T
@Alex - Orable 的选择需要存在 from
子句。
@Raj More 不,我正在使用现有的应用程序(JasperServer),我需要创建他们所谓的“派生表”,它只返回这个。不幸的是,SQL 存储在存储库中并且是固定的,因此无法抽象出来。
【参考方案1】:
AFAIK,您将需要不同的查询,除非您可以找到同时存在于 SQL Server 和 Oracle Server 上的表。
Oracle 使用DUAL
表进行虚拟查询,而在 SQL 服务器上仅选择常量的语法更简单:
select 'O' as Indicator
将返回单行记录集。
附:如果您打算只编写标准 SQL 并让它同时在 SQL Server 和 Oracle 上运行,请注意存在很多差异,即使您不使用数据库端代码(存储过程和函数)。
在我的脑海中,有些事情是不同的:
Case 语句语法 NVL 与 IsNull 空排序行为 数据转换函数 字符串操作函数 等等等等【讨论】:
数据库中的表是相同的,所以是的,我可以使用这个建议,例如:select distinct 'O' as INDICATOR from SOME_COMMON_TABLE; @Neil,从 SOME_COMMON_TABLE 中选择的缺点是您可能正在对该表执行 IO。如果您能够对 SQL Server 和 Oracle 分别使用适当形式的两个不同查询,则可以避免 IO。 (鉴于 Oracle 版本足够晚,支持“快速双”)【参考方案2】:如果没有 from 语句,您将无法在 Oracle 中选择数据。所以您需要在 Oracle 中有一个表(通常的做法是使用标准表 - Dual)。如果您真的需要在两个数据库服务器上运行相同的查询,最好的解决方案是在 MS SQL 中创建只有一行的 Dual 表。但实际上最好对不同的服务器使用不同的查询(也许通过一些抽象层)。
【讨论】:
是的,这会起作用,但我正试图摆脱创建伪表【参考方案3】:使用common table expression (CTE) 例如
WITH D (INDICATOR)
AS
(
SELECT *
FROM (
VALUES ('O')
) T (c1)
)
SELECT INDICATOR
FROM D;
或者更简单的排队:
SELECT *
FROM (
VALUES ('O')
) D (INDICATOR)
【讨论】:
【参考方案4】:您可以在 SQL Server 中创建 DUAL 表:
CREATE TABLE DUAL (DUMMY NVARCHAR(1) NOT NULL);
INSERT INTO DUAL VALUES ('X');
然后使用与 Oracle 中相同的查询:
select 'O' AS INDICATOR from DUAL;
【讨论】:
同上。是的,这会工作,但我试图摆脱创建伪表以上是关于SQL 在 SQL Server 和 Oracle 中返回固定数据的主要内容,如果未能解决你的问题,请参考以下文章
sql SQL Server和Oracle SQL的SQL语法的一些示例
SSIS 执行 SQL 任务,受 MERGE 语句影响的行(Oracle 和 SQL Server)
sql server的sql语句和oracle的sql语句有啥不同吗?