当first_value由于varchar值的大小而引发错误时的替代FIRST_VALUE /解决方法

时间:2019-06-28 16:14:52

标签: sql oracle

第一个值抛出错误,

  

ORA-06502:PL / SQL:数字或值错误:字符串缓冲区也是如此   由于varchar(32767)大而变小

我尝试过first_value,并且当输入值较小时可以正常工作,但是当输入值较大时,它可以缓解错误。 因此,我认为我不能像下面那样使用first_value。

SELECT 
ID,
FIRST_VALUE(User) over (partition by id order by date) as firstUser,
FIRST_VALUE(Comment) over (partition by id order by date) as FirstComment,
FIRST_VALUE(User) over (partition by id order by date desc) as lastUser,
FIRST_VALUE(Comment) over (partition by id order by date desc) as LastComment
from table;

是否有其他方法可以将两行合并为一个。 注释下方的查询是长时间运行的查询,因此要避免两次运行该查询。

例如

- ID | User | Date | Comment
- 1 | user1 | 2019/06/25 | comment1
- 1 | user2 | 2019/06/26 | comment2

期望结果

- ID | firstUser | FirstComment | lastUser | lastComment  
 1 | user1 | comment1 | user2 | comment2

1 个答案:

答案 0 :(得分:0)

我认为您不应该得到这样的错误。

但是,如果是这种情况,并且您想采用其他方法,那么下面是适合您的代码:

-- I have used || as a separator.. You can use your own separator, if needed
WITH DATAA (ID1,USER1,DATE1,COMMENT1) AS
(SELECT 1, 'USER1',DATE '2019-06-25','comment1' FROM DUAL UNION ALL
SELECT 1, 'USER2',DATE '2019-06-26','comment2' FROM DUAL)
SELECT
    ID1,
    REGEXP_SUBSTR(USER1, '[^(||)]+') AS FIRSTUSER,
    REGEXP_SUBSTR(COMMENT1, '[^(||)]+') AS FIRSTCOMMENT,
    REGEXP_SUBSTR(USER1, '[^(||)]+$') AS LASTUSER,
    REGEXP_SUBSTR(COMMENT1, '[^(||)]+$') AS LASTCOMMENT
FROM
    (
        SELECT
            ID1,
            RTRIM(XMLAGG(XMLELEMENT(E, USER1, '||').EXTRACT('//text()')
                ORDER BY
                    DATE1
            ).GETCLOBVAL(), '||') AS USER1,
            RTRIM(XMLAGG(XMLELEMENT(E, COMMENT1, '||').EXTRACT('//text()')
                ORDER BY
                    DATE1
            ).GETCLOBVAL(), '||') AS COMMENT1
        FROM
            DATAA
        GROUP BY
            ID1
    );

db<>fiddle demo

干杯!