Oracle SQL Loader问题:CSV中"330,000.00"存入Number列仅保留330
解决方案
问题根源
你的控制文件设置了FIELDS TERMINATED BY ',',但CSV中的数值"330,000.00"本身包含逗号,SQL Loader会把这个值拆成两个字段,导致CAPITAL仅取到逗号前的"330",后续的replace处理根本没生效。
可行修正方案
方案1:用引号包裹字段适配(若CSV数值带引号)
如果你的CSV中这类带逗号的数值是用引号包裹的(比如"330,000.00"),直接在控制文件里添加ENCLOSED BY '"',让SQL Loader识别被引号包裹的完整字段:
OPTIONS (SKIP=1) LOAD DATA INFILE * APPEND INTO TABLE test_table FIELDS TERMINATED BY ',' ENCLOSED BY '"' TRAILING NULLCOLS ( CAPITAL FLOAT "replace(:CAPITAL, ',', '')" )
方案2:手动指定列位置(无引号场景)
若CSV数值没有引号,通过POSITION明确指定该列的起始和结束位置,避免逗号被当作分隔符(需根据实际CSV列长度调整位置参数):
OPTIONS (SKIP=1) LOAD DATA INFILE * APPEND INTO TABLE test_table TRAILING NULLCOLS ( CAPITAL POSITION(1:10) FLOAT "replace(:CAPITAL, ',', '')" )
方案3:用FILLER吸收拆分字段(混合分隔场景)
如果其他列用逗号分隔,仅CAPITAL列带逗号,可把拆分后的第二部分定义为临时FILLER字段,再合并两个部分处理:
OPTIONS (SKIP=1) LOAD DATA INFILE * APPEND INTO TABLE test_table FIELDS TERMINATED BY ',' TRAILING NULLCOLS ( CAPITAL_PART1 CHAR, CAPITAL_PART2 FILLER CHAR, CAPITAL FLOAT "replace(concat(:CAPITAL_PART1, ',', :CAPITAL_PART2), ',', '')" -- 其他列按顺序定义 )
效果验证
修改后SQL Loader会完整读取带逗号的数值,通过replace函数移除逗号后,就能将330000.00正确存入Number类型的CAPITAL列。
内容的提问来源于stack exchange,提问作者Jai Shiddharth
相关产品推荐
相关产品推荐

