GBase 8a
适配迁移
问答

金额类字段转字符串,如何不保留小数里面最后的零。

发表于2026-08-17 10:49:18230次浏览7个评论

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

【GBase版本】:

9.5

【操作系统】:

麒麟V10

【CPU】:

ARM架构

【问题描述】*:

想要不保留后面的零(比如1232.120000转成1232.12)。目前现象是下面的。但是不是我要的结果。

gbase> insert into itl_db.testzza2(aa)values(1232.120000);
Query OK, 1 row affected (Elapsed: 00:00:00.01)

gbase> select * from itl_db.testzza2;
+----------------+
| aa             |
+----------------+
| 1232.1200000000|
+----------------+
1 row in set (Elapsed: 00:00:00.01)

gbase> create table itl_db.testzza(aa varchar(32));
Query OK, 0 rows affected (Elapsed: 00:00:00.02)

gbase> insert into itl_db.testzza(aa) select trim(aa) from itl_db.testzza2;
Query OK, 1 row affected (Elapsed: 00:00:00.07)
Records: 1  Duplicates: 0  Warnings: 0

gbase> select * from itl_db.testzza;
+----------------+
| aa             |
+----------------+
| 1232.1200000000|
+----------------+
1 row in set (Elapsed: 00:00:00.00)

gbase> insert into itl_db.testzza(aa) select aa from itl_db.testzza2;
Query OK, 1 row affected (Elapsed: 00:00:00.02)
Records: 1  Duplicates: 0  Warnings: 0

gbase> select * from itl_db.testzza;
+----------------+
| aa             |
+----------------+
| 1232.1200000000|
| 1232.1200000000|
+----------------+
2 rows in set (Elapsed: 00:00:00.01)

gbase> select version();
+--------------------------------+
| version()                      |
+--------------------------------+
| 9.5.3.28.35_patch.4.58ec1b70e1 |
+--------------------------------+
1 row in set (Elapsed: 00:00:00.00)

评论

登录后才可以发表评论
邹智发表于 1个月前
已处理 通过insert into itl_db.testzza(aa) select aa+0 from itl_db.testzza2; 可以满足
旭发表于 1个月前
使用 TO_CHAR 函数,并配合 FM (Fill Mode)参数来删除数字开头和结尾处的空格和小数末尾的零。
FM 参数必须放在格式字符串的最前面
如果金额为负数, FM 也会去掉负号前的空格,负号会紧跟在数字前面
对于纯小数(如0.7), FM 会去掉整数部分的0显示为 .7 ,如果需要保留整数部分的0,可以使用 FM0 组合

gbase> SELECT TO_CHAR(1234.55000, 'FM999999999.9') FROM dual ;
+--------------------------------------+
| TO_CHAR(1234.55000, 'FM999999999.9') |
+--------------------------------------+
| 1234.6 |
+--------------------------------------+
1 row in set (Elapsed: 00:00:00.01)

gbase> SELECT TO_CHAR(1234.55000, 'FM999999999.9999') FROM dual ;
+-----------------------------------------+
| TO_CHAR(1234.55000, 'FM999999999.9999') |
+-----------------------------------------+
| 1234.55 |
+-----------------------------------------+
1 row in set (Elapsed: 00:00:00.01)


或者以下几种方式
1.使用 TRUNCATE 函数截断
INSERT INTO products (price) VALUES (TRUNCATE(1234.5000, 2));
2.使用 CAST 转换
INSERT INTO products (price) VALUES (CAST(1234.5000 AS DECIMAL(10,2)));
3.直接使用 DECIMAL 类型字段
CREATE TABLE products (
price DECIMAL(10,2)
);
用户头像
GBase用户28017发表于 1个月前
转字符串存储。
GBase用户51829发表于 1个月前
SELECT regexp_replace(aa, '\.0+$|(\.\d*?)(0+)$', '\1') AS result
FROM itl_db.testzza2;
郑文发表于 1个月前
TRIM(BOTH '0' FROM TRIM(BOTH '.' FROM TO_CHAR(col, '99999999.99')))
用户头像
GBase用户28017发表于 1个月前
使用TOString成字符串呢。
用户头像
GBase用户28017发表于 21天前
TO_String。