SQLite中REAL类型列取负值异常问题咨询
解决SQLite中REAL列取负后被取整的问题
嘿,这个问题我之前碰到过类似的情况,大概率是数值格式不匹配导致的!
问题根源
你说列C定义为REAL类型,但实际存储的是像"123,456"这种用逗号作为小数点分隔符的字符串对吧?SQLite是弱类型数据库,虽然你给列指定了REAL类型,但如果插入的数据是带逗号的字符串,它会直接按字符串存储,而非真正的浮点数。当你用-C或0-C计算时,SQLite会尝试自动转换这个字符串为数值,但它默认只认.作为小数点,所以"123,456"会被截断为整数123,取负后自然得到-123。
解决方案
这里给你两种可行的处理方式:
1. 临时转换后关联(适合不想修改原数据的场景)
用REPLACE函数把逗号替换为小数点,再转成REAL类型后取负,然后关联另一张表:
-- 查询转换后的负值并关联另一张表 SELECT f.*, other.* FROM F f JOIN other_table other ON -CAST(REPLACE(f.C, ',', '.') AS REAL) = other.target_negative_column;
2. 从根源修正数据(推荐长期方案)
如果允许修改原表数据,直接把C列的字符串格式转换成真正的REAL类型:
-- 更新原表数据为正确的REAL格式 UPDATE F SET C = CAST(REPLACE(C, ',', '.') AS REAL); -- 之后直接用-C关联即可 SELECT f.*, other.* FROM F f JOIN other_table other ON -f.C = other.target_negative_column;
额外注意
如果你的数据里还存在千分位逗号(比如欧洲格式的"123.456,78"),需要先处理千分位符号再转换小数点:
-- 处理千分位+逗号小数点的混合格式 SELECT -CAST(REPLACE(REPLACE(C, '.', ''), ',', '.') AS REAL) AS negative_C FROM F;
内容的提问来源于stack exchange,提问作者edelwater
相关产品推荐
相关产品推荐

