DB2:按分隔符将常规结果字符串拆分为列
在DB2中,我有一个结果字符串,例如DB2:按分隔符将常规结果字符串拆分为列,db2,Db2,在DB2中,我有一个结果字符串,例如 Color|Product|Category|Price|... 现在我想生成四(或n)列,其中包含管道拆分的每个字符串标记 Col1 Col2 Col3 Col4 Col... Color Product Category Price ... 我在寻找一个任意列数的通解 此结果的用途是在与另一个SELECT查询的联合中使用它 有什么想法吗 您希望在何处显示此输出?通过DB2CLP,您可以使用另一个程序
Color|Product|Category|Price|...
现在我想生成四(或n)列,其中包含管道拆分的每个字符串标记
Col1 Col2 Col3 Col4 Col...
Color Product Category Price ...
我在寻找一个任意列数的通解
此结果的用途是在与另一个SELECT查询的联合中使用它
有什么想法吗 您希望在何处显示此输出?通过DB2CLP,您可以使用另一个程序 如果您想在另一个程序中检索值,这取决于该程序如何管理输出,并且您只需在扫描输出时放入表格即可 例如,对于Java
System.out.println(col1+"\t"+col2+"\t"+col3);
另一方面,如果要检索DB2CLP或类似shell中的值,则需要使用这些管道从数据库检索字符串,在将字段返回给用户之前,应该创建一个标量函数来处理该字段
您将需要以下函数
- 长度
- 鼻甲||
- 波斯特
CREATE OR REPLACE MODULE TEST@
ALTER MODULE TEST PUBLISH
FUNCTION PROCESS (
STRING varchar(255),
NEW_STRING varchar(255)
) RETURNS varchar(255)
@
ALTER MODULE TEST ADD
FUNCTION PROCESS (
STRING varchar(255),
NEW_STRING varchar(255)
) RETURNS varchar(255)
PROC: begin
DECLARE IND INT;
DECLARE LEN INT;
DECLARE MODU INT;
DECLARE CHARS INT;
DECLARE TAB INT DEFAULT 8;
DECLARE PRE VARCHAR(255);
DECLARE POS VARCHAR(255);
SET IND = POSSTR(STRING, '|');
IF (IND <> 0) THEN
SET PRE = SUBSTR(STRING, 1, IND - 1);
SET POS = SUBSTR(STRING, IND + 1);
SET NEW_STRING = TEST.PROCESS (POS, NEW_STRING);
SET PRE = TRIM(PRE);
SET LEN = LENGTH(PRE);
SET MODU = MOD(LEN, TAB);
IF (MODU <> 0) THEN
SET CHARS = TAB - MODU;
WHILE (CHARS <> TAB) DO
SET PRE = CONCAT (PRE, ' ');
SET CHARS = CHARS + 1;
END WHILE;
END IF;
ELSE
SET PRE = STRING;
END IF;
RETURN CONCAT (PRE, COALESCE(NEW_STRING,''));
end PROC@
谢谢你的回复。我喜欢通过批处理文件将DB2表导出为csv,并且需要导出列标题。因为它们可能会改变(列、名称的顺序),所以我需要从syscat.columns中检索它们。现在我正在寻找一种方法,在一个命令中导出头和数据,这样我就不必在导出后将头和数据复制到一个文件中(磁盘上需要两倍的空间)。
db2 -td@ -f function.sql ; db2 "values test.process('Color|Product|Category|Price|...','')"
1
-----------------------------------------
Color Product CategoryPrice ...
1 record(s) selected.