sql怎么把字符串转换为数字?

上周我的一个朋友在做一些数据库操作时遇到了将字符串转换为数字的问题。
他说,在SQL中有两种方法可以做到这一点:一种是CAST函数,另一种是CONVERT函数。

CAST函数直接使用字符串作为数字,例如:CAST('1 2 3 ' AS INT),结果是整数1 2 3
但是要注意,如果字符串不是数字,比如字母,CAST会报错。
所以你需要确保转换后的字符串是一个实数。

CONVERT函数与CAST类似,也是用来转换数据类型的。
它的工作方式相同:CONVERT(INT, '1 2 3 '),结果也是 1 2 3
但是,CONVERT 函数在不同的数据库系统上的行为可能有所不同,具体取决于它的使用方式。

朋友说他测试了一下,发现两种方法都可以,但是选择要根据数据库情况而定。
例如,MySQL 支持这两种方法,但 SQL Server 更经常使用 CONVERT。

所以,他说,最好在使用之前检查文档,或者直接在数据库中尝试,看看哪种方法效果最好。
他仍然想知道是否需要考虑性能问题,但我不太明白。

算了,你自己就会明白的。

sql怎么把字符型变成数值

哎呀,让我和你谈谈。
去年我在上海开发一个 ERP 系统,遇到了一个可怕的问题。
数据全部是文本格式,薪资字段全部是“¥5 000”,带有逗号和货币符号。
如何使用这个?无法运行报告。

当时我就想,我得把它转换成数字。
我查了很久,发现MySQL中有几种转换数字的方式:
第一种方式,CAST是最常见的。
我告诉你,这个东西MySQL、Oracle、SQL Server都可以用。
我写了一个SQL,结果是这样的: sql SELECT CAST(工资 AS DECIMAL(1 0,2 )) AS number_salary FROM员工;
注意,如果工资里有乱码,比如‘张三’或者‘¥’,直接转会报错,数据库会生气。

另一个技巧,CONVERT 也可以。
这与 CAST 类似,但顺序发生了变化。
我在 SQL Server 上使用过它并告诉朋友: sql SELECT CONVERT(INT, id) FROM customer;
也可以使用MySQL,但是MySQL的CONVERT功能没有那么强大,主要是CAST起作用。

第三步,Oracle 独有的,TO_NUMBER。
这东西太神奇了,可以处理数千个分隔符。
我在北京做Oracle项目的时候用过它。
当时工资数据格式是“5 000”。
可以这样转换: sql SELECT TO_NUMBER(salary, '9 9 9 9 .9 9 ') FROMEmployees;
格式为 9 9 9 9 .9 9 千位逗号和货币符号不计为数字,自行处理。

第四个技巧是 SQL Server 独有的,NUMERIC。
我很少遇到这种情况,所以我通常只使用 CAST。
写法是: sql SELECT NUMERIC(1 0.2 ,salary)FROM员工;
1 0.2 是精度和小数位数,你可以自己决定。

我给你写下要点: 1 、数据必须合法。
如果你在数据库中输入“abc”,如果不起作用,它会立即崩溃。
因为这个,我半夜被叫到上海的机房。
所有数据都传输错误,这让我很着急。
2 .准确性问题。
例如,如果“3 .1 4 1 5 9 ”转换为 DECIMAL(3 ,2 ),则结果为“3 .1 4 ”并且精度会丢失。
如果报告中的数字不相符,则必须进行修改。
3 、数据库不同,用途不同。
对于 MySQL 和 PostgreSQL,请使用 CAST 或 CONVERT。
Oracle 必须使用 TO_NUMBER。
SQL Server 有些人喜欢NUMERIC,但我觉得麻烦。

最烦人的操作,数据不确定怎么调整数据?您可以使用正则表达式对其进行过滤。
这就是我当时在 MySQL 上所做的: sql 选择 案例 当工资 REGEXP '^[0-9 ]+(.[0-9 ]+)?$' THEN CAST(工资 AS DECIMAL(1 0,2 )) 否则为空 END AS 转换后的工资 FROM 员工;
这样干净的数字就被传输了,而混乱的部分就被直接忽略了。
然后电脑清理花了三天时间,头发掉了很多。

简而言之,在将字符转换为数字时,您必须根据您使用的数据库选择一种方法。
不要乱搞,否则你的数据会被炸毁。

sql怎么把字符串转换为数字?

哈,你的问题很有趣。
上周,一位客户非常着急,他的财务报表不正确,而且所有数据都是文本格式。
我看了看,说,嘿,这是一个典型的问题。

你说的这些方法都是对的,关键是你怎么用。
让我给你一个概述:
首先我们来谈谈数字的转换:
1 CAST 和 CONVERT 是最常用的 例如,CAST('1 2 3 .4 5 ' AS DECIMAL(1 0, 2 )) 或 CONVERT(DECIMAL(1 0, 2 ), '1 2 3 .4 5 '),这两个是 SQL Server 中的标准。
在您的示例中, CAST('1 2 3 ' AS INTEGER) 简单粗暴,但有时不够精确。
最好使用 DECIMAL,特别是对于金额,浮点数可能会导致问题。

2 加0的酷操作 SELECT '1 2 3 ' + 0 AS num -> 1 2 3 这个行业很强大,底层会自动帮你转换,省去你的麻烦。
不过可读性一般,做复杂SQL的时候很容易眼花缭乱。

核心问题:检查amount列的小数规范
你的CAST(Amount AS DECIMAL(1 0, 4 )) > 5 00或者CONVERT(DECIMAL(1 0, 4 ), Amount) > 5 00,这个想法是正确的,但是要看具体场景。

场景一:数据量小,快速测试 您可以直接使用此条件进行尝试。
例如,如果您使用的是 MySQL,则可能需要编写 SELECT CAST(amount AS DECIMAL(1 0, 4 )) AS Decimal_amount FROM table_name WHERE CAST(amount AS DECIMAL(1 0, 4 )) > 5 00;。
看看是否可以将字符串转换为数字,然后过滤掉大于 5 00 的。
这个方法很简单。

场景二:想要彻底改造专栏 如果您想将整个列更改为 DECIMAL 类型(这通常是个好主意),您可能需要更复杂的语句,或者只需创建一个新表。
例如,在 SQL Server 中,您可以 ALTER TABLE 表名 ADD 新金额列 AS (CAST(Amount AS DECIMAL(1 0, 4 ))) PERSISTED;然后检查新列。

关于扩展信息的内容:
你说得对,DECIMAL和FLOAT/REAL转换确实不同。

DECIMAL(1 0; 8 ) 存储精确值,例如 1 2 3 4 5 6 7 8 .1 2 3 4 5 6 7 8 将其转换为字符串后按原样输出。
FLOAT(1 0, 5 ) 存储近似值。
计算机内部使用二进制表示,因此会损失准确性。
例如,1 2 3 4 5 6 7 8 9 用科学记数法可以存储为 1 .2 3 4 5 7 e+08 您的 DECLARE @i FLOAT;设置@i = 1 2 3 4 5 6 7 8 9 ; PRINT 'test: ' + CONVERT(VARCHAR(2 0), @i) 输出 test: 1 .2 3 4 5 7 e+008 这就是浮点数的本质。
不要指望它是完全准确的。

我的建议:
1 首先验证精度要求 金额栏需要多少位小数? 0.01 元够准确吗?如果这足够了,请使用 DECIMAL(1 0, 2 )。
如果这还不够,例如分,则使用 DECIMAL(1 0, 4 )。
2 . 检查 CAST/CONVERT 编写一个简单的查询,使用CAST或CONVERT转换部分数据,看看结果是否正确。
例如,SELECT amount, CAST(amount AS DECIMAL(1 0, 2 )) AS conversioned amount FROM tablename LIMIT 1 0;。
如果转换后的数字看起来不对(例如字符串直接转换为0),则说明原始数据有问题。
3 、循序渐进,不要鲁莽 如果要转换整个列,建议先尝试添加新列,验证没有问题,然后替换旧列。

你的客户最后用CONVERT写了一个大查询解决了这个问题,但是他之前尝试加0,发现有些地方又加了,相当混乱。
所以,根据情况使用,不要掉头。

无论如何,这取决于你。
如果你告诉我具体的表结构或数据库类型(MySQL、SQL Server、PostgreSQL?),我可以给你更具体的例子。