栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

sql中的union子句

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

sql中的union子句

这个答案可能有点漫不经心…

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

觉得 你的第二个查询,因为甲骨文求值失败

to_number()
多项 之前 执行到
union
,但评估它与“空性” 之后。您的第一个查询成功,因为第一个值已被评估为“null-ness”,然后
union
出现。这意味着评估顺序为:

  1. 第一选择功能
  2. 第一选择数据类型
  3. 第二选择功能
  4. 联盟
  5. 第二选择数据类型

我将尝试逐步证明这一点,但我不确定它是否可以构成绝对证明。

以下两个查询

select 1 from dual union select '1' from dual;select '1' from dual union select 1 from dual;

由于未发生任何隐式转换,因此将失败并显示以下错误。

ORA-01790:表达式必须具有与相应表达式相同的数据类型

但是,以下两项都将成功

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: 49NULLSQL> select dump(a)  2    from ( select null a from dual union select 1 from dual );DUMP(A)-------------------------------------------------------------------Typ=2 Len=2: 193,2NULL

如您所见,这些列具有不同的数据类型。第一个查询包含一个字符,返回一个a

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  4select to_char(null),loc from dept  5       );A  B----------------------------------- -----------------------------------Typ=1 Len=6: 104,97,104,97,104,97   NULLNULL          Typ=1 Len=6: 104,97,104,97,104,97SQL>

您可以看到它

dump(to_number(null))
为空;但
varchar2
不会
char
返回a,因为这是您列的数据类型。有趣的是,返回的语句的顺序没有被颠倒,并且如果您要将该查询创建为表,则两列都将是
varchar2

在选择查询中确定列的数据类型时,Oracle会采用第一个已知数据类型,然后使用该数据类型来计算总体数据类型。这就是为什么第一个

select
为空的查询的行被反转的原因。

您的第一个查询成功,因为第一个选择

select ename,to_number(null) fromemp
“描述了”结果集的外观。
|varchar2|null|
。然后,第二个查询添加
|varchar2|varchar2|
,这不会造成任何问题。

您的第二个查询失败,因为第一个选择

select ename,to_number(null) from emp
将结果集“描述”为
varchar2,null
。但是,您然后尝试在中添加一个空数字和一个varchar2
union

信念的飞跃在于,Oracle决定该

to_number(null)
数字 在之前
union
而不是
此之后才对其进行“空值”评估。我真的不知道如何测试这种情况是否真的发生,因为您无法创建带有
null
列的对象,并且您也不能选择它。

由于无法证明Oracle不允许的内容,我将尝试提供经验证据。考虑以下查询的结果(或错误)。

SQL> select 1 as a from dual union select to_number(null) from dual;         A----------         1SQL> 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 expressionSQL> 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 expressionSQL> select '1' as a from dual union select to_char(null) from dual;A-1

它们似乎证明了

to_char
to_number
,无论是否对null进行隐式定义的数据类型,然后在
union
对其进行“ null-ness”评估之前先对数据类型进行适当性评估。

该解释也将涵盖该

coalesce
问题,因为在
to_number(null)
为null 之前 它是一个数字。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/414725.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号