gpt4 book ai didi

sql - sql 中的 union 子句

转载 作者:行者123 更新时间:2023-12-04 01:07:25 28 4
gpt4 key购买 nike

给出下表描述:

emp : 

ename varchar2(25)


dept:

loc varchar2(25)

我有以下3种情况:
select ename,to_number(null) from emp
union
select to_char(null),loc from dept;
  select ename,to_number(null) from emp
union
select to_number(null),loc from dept;
  select ename,null from emp
union
select null,loc from dept;

案例1完美执行。

情况2无法执行。

案例 3 也完美执行。

我的理解是,我们需要确保如果联合没有对应的列,那么我们需要创建一个等效的数据类型虚拟。因此,一个 number输入类似 to_number(null) 的内容在另一个表的相应列列表中。

在情况3中,我们指定了所有null,所以我有点理解这种情况。但在情况 1 中, loc 之间没有数据类型兼容性。和 to_number ,但它执行。另一方面,情况 2 失败了。请说清楚。

最佳答案

这个回答可能有点啰嗦……

Oracle 对集合操作非常挑剔。每列必须与第二、第三等查询中的相应列具有相同的数据类型。

我认为您的第二个查询失败,因为 Oracle 评估 to_number()作为执行 union 之前的数字但之后评估它的“空性”。您的第一个查询成功,因为第一个值已被评估为“空性”,然后是 union发生。这意味着评估的顺序是:

  • 第一选择功能
  • 第一个选择数据类型
  • 第二选择功能
  • 工会
  • 第二个选择数据类型

  • 我将尝试一步一步地证明这一点,但我不确定它是否会构成一个绝对的证明。

    以下两个查询
    select 1 from dual union select '1' from dual;
    select '1' from dual union select 1 from dual;

    将失败并出现以下错误,因为没有发生隐式转换。

    ORA-01790: expression must have same datatype as corresponding expression



    但是,以下两种方法都会成功
    select null from dual union select '1' from dual;
    select null from dual union select 1 from dual;

    如果我们选择 dump 在这两个查询中,返回以下内容:
    SQL> select dump(a)
    2 from ( select null a from dual union select '1' from dual );

    DUMP(A)
    -------------------------------------------------------------------

    Typ=96 Len=1: 49
    NULL

    SQL> select dump(a)
    2 from ( select null a from dual union select 1 from dual );

    DUMP(A)
    -------------------------------------------------------------------

    Typ=2 Len=2: 193,2
    NULL

    如您所见,列有 different data-types .第一个带有字符的查询返回 char第二个返回一个数字,但是顺序已经反过来了,第二个 select先来。

    最后,如果我们看 dump您的第一个查询
    SQL> select substr(dump(ename),1,35) a, substr(dump(loc),1,35) b
    2 from ( select ename,to_number(null) as loc from emp
    3 union
    4 select to_char(null),loc from dept
    5 );

    A B
    ----------------------------------- -----------------------------------
    Typ=1 Len=6: 104,97,104,97,104,97 NULL
    NULL Typ=1 Len=6: 104,97,104,97,104,97

    SQL>

    你可以看到 dump(to_number(null))一片空白;但是一个 varchar2不是 char正在返回,因为这是您的列的数据类型。有趣的是,返回语句的顺序没有颠倒,如果您将此查询创建为表,两列都将是 varchar2 .

    在选择查询中决定列的数据类型时,Oracle 采用第一个已知数据类型,然后使用它来计算整体数据类型。这就是为什么查询第一个 select 的原因。为 null 将它们的行颠倒了。

    您的第一个查询成功,因为第一个选择, select ename,to_number(null) from emp ,“描述”结果集的样子。 |varchar2|null| .然后第二个查询添加, |varchar2|varchar2| ,这不会导致任何问题。

    您的第二个查询失败,因为第一个选择 select ename,to_number(null) from emp “描述”结果集为 varchar2, null .但是,您随后尝试在 union 中添加一个空数字和一个 varchar2。 .

    这里的信仰飞跃是甲骨文决定 to_number(null)union 之前的数字直到之后才评估它的“空性”。我真的不知道如何测试这是否真的发生了,因为你不能用 null 创建一个对象。列,正如您所注意到的,您也无法选择它。

    由于我无法证明 Oracle 不允许的内容,因此我将尝试获取经验证据。考虑以下查询的结果(或错误)。
    SQL> select 1 as a from dual union select to_number(null) from dual;

    A
    ----------
    1


    SQL> select '1' as a from dual union select to_number(null) from dual;
    select '1' as a from dual union select to_number(null) from dual
    *
    ERROR at line 1:
    ORA-01790: expression must have same datatype as corresponding expression


    SQL> select 1 as a from dual union select to_char(null) from dual;
    select 1 as a from dual union select to_char(null) from dual
    *
    ERROR at line 1:
    ORA-01790: expression must have same datatype as corresponding expression


    SQL> select '1' as a from dual union select to_char(null) from dual;

    A
    -
    1

    他们似乎证明了 to_charto_number ,无论它们是否在 null 上执行,都隐式定义了一个数据类型,然后在 union 中评估它的适用性。 ,在他们评估“空性”之前

    此解释还将涵盖 coalesce问题为 to_number(null)在它为空之前是一个数字。

    关于sql - sql 中的 union 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12057748/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com