如何在oracle中按行连接所有列,忽略4k字符限制



我将所有列连接起来,并对每个列应用NVL()函数。

我正在使用python连接到oracle db,所以我能够轻松地获得列名,然后应用一些连接与列表获得所需的选择查询,如:

select NVL(col1,'?')||NVL(col2,'?')...

在聚合值超过4k字符之前,它工作得很好。

我试图搜索并找到关于listagg,但问题是它是垂直使用的,我想要按行连接。

我用来生成MD5的连接值。

将它们连接为CLOB。要做到这一点,可以从EMPTY_CLOB():

开始
SELECT EMPTY_CLOB()||NVL(col1,'?')||NVL(col2,'?')...

或者使用TO_CLOB:

SELECT TO_CLOB(NVL(col1,'?'))||TO_CLOB(NVL(col2,'?'))...

或者仅仅是第一列的TO_CLOB:

SELECT TO_CLOB(NVL(col1,'?'))||NVL(col2,'?')...

db<此处小提琴>

选择了长字符串,对吧?一个变量?在Oracle的SQL级别,它被限制为VARCHAR2(4000),但在PL/SQL中它变成了32K,所以一个选择是切换到PL/SQL。

否则,使用CLOB数据类型而不是VARCHAR2


与您正在做的事情无关,但是-NVL函数将用于在COL1NULL的情况下获得一些值。你所做的一切都是无用的,因为你是在"皈依"。COL1中可能的NULL值变成一个空字符串(两个连续的单引号,''),这在Oracle中相当于NULL,所以你可以只使用

select col1 || col2 || ...

如果是这样就有意义了

select nvl(col1, 'x') || nvl(col2, 'x') || ...

最新更新