gpt4 book ai didi

sql - Oracle SQL - 按字符转换分组

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

在 group-by 子句中使用字符转换会产生意想不到的结果:

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 表达式”,因为 group-by 子句不同于选择子句
  • 长度为 2 'Ab' 的结果.

  • 更换 cast(col as char(2))cast(col as 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] 或 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 上失败:字符串连接的结果太长。

    好奇的...

    关于sql - Oracle SQL - 按字符转换分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37706645/

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