在Oracle中不引用双表而不从任何内容中选择?

oxf4rvwz  于 2023-04-11  发布在  Oracle
关注(0)|答案(4)|浏览(131)

在Oracle SQL中,在引用双表时,会从nothing中进行选择,如

SELECT sysdate FROM dual;

现在我想有一个查询,也适用于PostgreSQL,但选择从双有是不可能的。我知道,我可以放弃整个FROM部分,但它不会在Oracle中工作。
我也试过像SELECT CURRENT_TIMESTAMP FROM VALUES(1)) V(C);这样的东西,但Oracle也做不到这一点。

那么,有没有一种方法可以在不使用Oracle SQL中的dual表的情况下从任何地方进行选择?

izkcnapc

izkcnapc1#

或者,在Postgres中创建一个名为dual的表,由1行和1列组成

create table dual as (select 1);

你可以像在Oracle中一样在Postgres中使用它

select 'whatever' from dual;
 ?column?
-----------
 whatever
yduiuuwa

yduiuuwa2#

Oracle中的sysdate是一个内置函数,即不是数据库表的列。只要查询只返回一行,就可以使用任何表,例如:

select sysdate from EMP where rownum < 2
zd287kbt

zd287kbt3#

如果您有一个小表TABLE_B,其中至少有一行,则可以尝试从其中选择一行。

select sysdate from TABLE_B where rownum < 2;

表的内容无关紧要,因为您不会选择其中的任何列。

eqfvzcg8

eqfvzcg84#

在Oracle 21c及以下版本中,下面的代码使用XMLTABLE函数在Oracle和Postgres(10+)中生成一个假行。这段代码非常奇怪,但它不需要任何自定义对象。

--Generate a fake row in either Oracle or Postgres.
select *
from xmltable
(
    --The expression syntax is different for Oracle and Postgres.
    --Oracle can use a literal, Postgres must reference the XML.
    --The string '' is null in Oracle but not null in Postgres.
    case when '' is null then '1' else '/a' end passing '<a>1</a>'
    columns test int path '.'
);

test
----
   1

在Oracle 23c及更高版本中,Oracle终于支持不带FROM子句的选择:

SQL> select sysdate;

SYSDATE
---------
06-APR-23

相关问题