这是我以前用来获取金钱价值的查询。当concat值超过异常时坚果。查询是
select to_char(b.balance,'9999.'||d.number_of_decimal_places) from balance b, decimal d
我遇到了这个问题。
答案 0 :(得分:1)
如果您有数字number_of_decimal_places
值,例如1,2,3等,那么您正在构建一个格式模型,例如'9999.2'
而不是'9999.99'
。
您可以使用rpad
或lpad
将该整数值转换为格式模型:
select to_char(b.balance,'9999.'||rpad('9', d.number_of_decimal_places, '9'))
from balance b, decimal d
或者尾随零:
select to_char(b.balance,'9999.'||rpad('0', d.number_of_decimal_places, '0'))
from balance b, decimal d
如果您有number_of_decimal_places
字符串,例如' 9',' 99',' 999'等等,除非你在其中一行中有一个无效的值,除了9或0以外的任何字符,你所使用的连接都会有效。
包含空格,您可以在varchar2
或char
字段中添加空格。无论哪种方式,您都可以删除trim
:
select to_char(b.balance,'9999.'||trim(d.number_of_decimal_places))
from balance b, decimal d
但是如果你有任何其他角色,那么你需要识别并纠正这些行中的数据;如果数据是varchar2
列,那么即使使用空格也可以更好地修复数据。
最好使用新式连接;我没有改变这些例子,因为如果你做的是笛卡尔积或者只是省略了连接条件,那就不清楚了。
答案 1 :(得分:0)
如果number_of_decimals
返回2
之类的值,则:
SELECT TO_CHAR( b.balance, RPAD( '9999.', 5 + d.number_of_decimals, '9' ) )
FROM balance b
CROSS JOIN
decimal d
答案 2 :(得分:0)
无论出于何种原因,' 9999。' || d.number_of_decimal_places的连接正在生成无效的掩码。我们只能猜测实际的表值,空格的存在,或其他可能导致它正在做什么的问题。
所以你的解决方案就是运行:
select '9999.'||d.number_of_decimal_places from decimal d
查看您正在生成的实际格式掩码,并根据需要进行调整。