DB2 中的 datastage 转换函数的等价物是啥

Posted

技术标签:

【中文标题】DB2 中的 datastage 转换函数的等价物是啥【英文标题】:what is the equivalent of datastage convert function in DB2DB2 中的 datastage 转换函数的等价物是什么 【发布时间】:2020-04-29 13:45:06 【问题描述】:

Convert 函数返回一个变量的副本,其中变量中每次出现的指定字符都替换为其他指定字符。每次要转换的字符出现在变量中时,它都会被替换字符替换。 示例:

A="NOW IS THE TIME"
PRINT A
A=CONVERT('TI','XY',A)
PRINT A
A=CONVERT('XY','T',A)
PRINT A

输出

NOW IS THE TIME
NOW YS XHE XYME
NOW S THE TME

如何在 db2 查询中实现这一点。

【问题讨论】:

【参考方案1】:

TRANSLATE 是 DB2 LUW(例如 9.7)中功能齐全的等价物: https://www.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000862.html

SET A = 'NOW IS THE TIME';
--PRINT A
SET A = TRANSLATE(A, 'XY', 'TI');
--PRINT A
SET A = TRANSLATE(A, 'T', 'XY', ''); --empty padding crucial!
--PRINT A

【讨论】:

【参考方案2】:

我认为相当于translate():

translate(A, 'XY', 'TI')

Here 是一个数据库小提琴。

这不是完全等效的。不幸的是,默认情况下,DB2 中的translate() 不会删除字符(Oracle 中的translate() 会删除字符)。相反,当“to”字符串比“from”字符串短时,DB2 会用空格或显式填充字符替换它们。只有当pad 的长度为零时,它才会删除字符。

select translate(translate('NOW IS THE TIME', 'XY', 'TI'), 'T', 'XY', '')
from sysibm.sysdummy1

【讨论】:

为什么不使用带有空填充的 TRANSLATE,适用于 LUW DB2 9.7: translate('NOW IS THE TIME', '', 'I', '') == 'NOW S THE TME' ;请参阅ibm.com/support/knowledgecenter/SSEPGG_9.7.0/…,其中:“该值的长度属性必须为零或一。如果指定了零长度字符串,则删除 from-string-exp 中的字符,而 to-string-exp 中没有相应的字符来自 char-string-exp 或 graphics-string-exp。”【参考方案3】:

你可以使用replace:

REPLACE(A, 'TI', 'XY')

【讨论】:

【参考方案4】:

DB2 中的 REPLACE 函数将 source-string 中所有出现的 search-string 替换为 replace-string。如果在 source-string 中找不到 search-string,则 source-string 原样返回。 https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/sqlref/src/tpc/db2z_bif_replace.html 有用的是,DataStage 还有一个 Replace() 函数,具有相同的功能。

【讨论】:

以上是关于DB2 中的 datastage 转换函数的等价物是啥的主要内容,如果未能解决你的问题,请参考以下文章

datastage导入sequential文件到db2数据库出现乱码,是设置不正确吗

将系统日期添加到DataStage转换器,格式为“mm / dd / yyyy hh:mm:ss”

DB2 中的 Cross Apply 等价物

datastage中怎样进行行列转换和列行转换,工具是datastage7.5,

从 IBM DB2 迁移到 Netezza 的挑战

datastage具体啥意思?能帮忙说明清楚吗?