String 在DB2SQL中将varchar字符串转换为货币格式

String 在DB2SQL中将varchar字符串转换为货币格式,string,db2,currency-formatting,String,Db2,Currency Formatting,我有一个列,我必须从中提取字符串,然后将其格式化为美国货币格式,小数点后2位 例如: 列值:{tag}00000820890 | 因此,我必须匹配标记并提取20000890,并将其格式化为200008.90 我已使用以下代码提取零件: LTRIM(REGEXP_SUBSTR('match pattern', 1,1,'i',,1), '0') 其中,匹配模式是'\{tag\}(.*?\\|' 有了这个,我可以提取20000890 然后我尝试了下面的to_char和to_number函数,将其设

我有一个列,我必须从中提取字符串,然后将其格式化为美国货币格式,小数点后2位

例如: 列值:
{tag}00000820890 |

因此,我必须匹配标记并提取20000890,并将其格式化为200008.90

我已使用以下代码提取零件:

LTRIM(REGEXP_SUBSTR('match pattern', 1,1,'i',,1), '0')
其中,匹配模式是
'\{tag\}(.*?\\|'

有了这个,我可以提取
20000890

然后我尝试了下面的to_char和to_number函数,将其设置为逗号分隔的货币格式,并带有2个小数点

to_char(ltrim(Regexp_substr('match pattern',1,1,'i',1),'0'), '99G999G999D99')
但这带来了以下错误:

Sql错误-20447,sqlstate 22007 sqlerrmc 99G999G999D99 Sysibm.Varchar-format

然后我试着

to_char(to_number(ltrim(Regexp_substr('match pattern',1,1,'i',1),'0')), '99G999G999D99')
但这也带来了错误:

Sql错误-20476,sqlstate 22018 sqlermc DECFLOAT_格式;99G999G999D99

我不确定是什么原因导致了这个错误。

看一看。它是映射到字符的函数。组分隔符不是G,而是“,”或“.”。基本上,您必须将格式化字符串
99G999G999D99
替换为类似
9999999
的内容

Db2文档中有更多的例子。它是映射到字符的函数。组分隔符不是G,而是“,”或“.”。基本上,您必须将格式化字符串
99G999G999D99
替换为类似
9999999
的内容


Db2文档中有更多的例子。

您尝试使用的格式仅从V11.5开始受支持。


比较
表2。将十进制浮点的元素从两个链接格式化为varchar

此外,您必须将字符串强制转换为
的第一个参数中的数值,以_CHAR

SELECT TO_CHAR(DECFLOAT(REGEXP_SUBSTR(V, '\{tag\}(.*?)\|', 1, 1, 'i', 1)), '99,999,999.99') 
FROM (VALUES '{tag}0000020000890|') T(V);

仅从V11.5开始支持您尝试使用的格式。


比较
表2。将十进制浮点的元素从两个链接格式化为varchar

此外,您必须将字符串强制转换为
的第一个参数中的数值,以_CHAR

SELECT TO_CHAR(DECFLOAT(REGEXP_SUBSTR(V, '\{tag\}(.*?)\|', 1, 1, 'i', 1)), '99,999,999.99') 
FROM (VALUES '{tag}0000020000890|') T(V);

这些不是Oracle错误。您确定没有使用DB2吗?哦,是的,这是DB2SQL错误。我没有;我不知道:(这些不是Oracle错误。你确定你没有使用DB2吗?哦,是的,这是DB2 sql错误。我不知道:(很酷,谢谢,现在它工作起来没有抛出错误,但问题是,它在结尾加了.00,但我希望最后两位数字作为小数部分。有没有办法插入“.”从两个字符的后面开始,比如:Insert(string,“.”,right(2)我使用了regex\u replace函数,并将字符串本身的十进制格式设置为这个REGEXP\u replace(MESSAGE\u TEXT,'.\{tag\}(.*)(?=\d{2})(\d{2})\\\.'.'\1.\2')在应用了DECFLOAT和TO_CHAR之后,就像你提到的那样…它现在工作得很好!谢谢,非常酷,谢谢,现在它工作没有抛出错误,但问题是,它在结尾加了.00,但我希望最后两位数字作为小数部分,有没有办法在2个字符后面插入“.”比如:insert(string,“.”,right(2)我使用了regex\u replace函数,并将字符串本身的十进制格式设置为如下REGEXP\u replace(消息文本,.*{tag\}(.*)(?=\d{2})\\\\\\.*,'\1.\2')在那之后,应用了DECFLOAT和TO_CHAR,就像你提到的那样…它现在工作得很好!多谢了Hanks,但是出于某种原因,varchar_格式抛出了错误谢谢,但是出于某种原因varchar_格式抛出了错误