在 SQL 中表示(作为文本)数字的标准方式类似于:
16000.00
15000.00
16000.00
所以,你在文本中的逗号伤害了你。
解决这个问题最明智的方法是将数据存储为numeric,而不是使用字符串(text、varchar、character)类型,正如a_horse_with_no_name 已经建议的那样.
但是,假设这样做是有充分理由的,例如您继承了无法更改的设计,一种可能性是删除所有不是(减号、数字、句点)之前的字符 转换为数字:
假设这是您的输入数据
CREATE TABLE tableone
(
bonus text
) ;
INSERT INTO tableone(bonus)
VALUES
('16,000.00'),
('15,000.00'),
('16,000.00'),
('something strange 25'),
('why do you actually use a "text" column if you could just define it as numeric(15,0)?'),
(NULL) ;
您可以使用 regexp_replace 和正确的正则表达式 ([^-0-9.]) 删除所有奇怪的字符,然后使用 globally:
SELECT
CAST(
COALESCE(
NULLIF(
regexp_replace(bonus, '[^-0-9.]+', '', 'g'),
''),
'0')
AS numeric)
FROM
tableone ;
|合并 |
| --------: |
| 16000.00 |
| 15000.00 |
| 16000.00 |
| 25 |
| 150 |
| 0 |
看看 15,0 会发生什么(这可能不是您想要的)。
在 dbfiddle here
上检查所有内容