我将所有列连接起来,并对每个列应用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
函数将用于在COL1
是NULL
的情况下获得一些值。你所做的一切都是无用的,因为你是在"皈依"。COL1
中可能的NULL
值变成一个空字符串(两个连续的单引号,''
),这在Oracle中相当于NULL
,所以你可以只使用
select col1 || col2 || ...
如果是这样就有意义了
select nvl(col1, 'x') || nvl(col2, 'x') || ...