加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle SQL – 由char cast组

发布时间:2020-12-12 13:16:00 所属栏目:百科 来源:网络整理
导读:在group-by子句中使用char-cast会导致意外情况: select cast(col as char(2)) from ( select 'Abc' as col from dual union all select 'Abc' as col from dual) group by cast(col as char(10)); 结果是’Abc'(长10个字符). 直观地说,我原以为Oracle会返回
在group-by子句中使用char-cast会导致意外情况:

select cast(col as char(2)) from (
  select 'Abc' as col from dual
  union all
  select 'Abc' as col from dual
) group by cast(col as char(10));

结果是’Abc'(长10个字符).
直观地说,我原以为Oracle会返回以下其中一项:

>错误:’不是分组表达式’,因为group-by子句不是选择子句
>长度为2’Ab’的结果.

用cast替换cast(col作为char(2))(col作为char(3)),Oracle返回错误’而不是group-by表达式’.这也是一种非常奇怪的行为.

怎么解释这个?它背后的原因是什么?

我正在使用Oracle SQL 11g.

解决方法

如上所述,我认为存在误解. o.O

我无法解释为什么会这样做,但这里是您所拥有的查询类型的模式:

如果你有点像这样概括,其中[A]和[B]是整数,[STRING]是你想要的任何文本:

select cast(col as char([A])) from (
  select '[STRING]' as col from dual
  union all
  select '[STRING]' as col from dual
) group by cast(col as char([B]));

如果以下两个条件中的一个为真(可能还有其他条件),它看起来总是会失败:

>(LENGTH([STRING])< [B] OR LENGTH([STRING]> [B])和[A] = LENGTH([STRING])
>(LENGTH([STRING])= [B] AND [A]<> LENGTH([STRING]))

否则,它将返回一行.

但是如果你把你的例子运行并在CREATE TABLE语句中使用它,那么它将失败,因为它将列宽设置为2并且不能适应进来的3个字符串.

为了增加奇怪性,如果你在字符串的开头和结尾添加一些东西,如下所示:

select '*'||cast(col as char([A]))||'*' from (
  select '[STRING]' as col from dual
  union all
  select '[STRING]' as col from dual
) group by cast(col as char([B]));

这仅在[A]> = [B]时有效,否则在ORA-01489上失败:字符串连接的结果太长.

好奇…

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读