我有一个包含此格式数字的数据文件:
xx.xx (example : 0.3)
我必须使用逗号而不是要在数据库中加载的点来转换它们。这是我的控制文件:
LOAD DATA
REPLACE
INTO TABLE USER.MYTABLE
FIELDS TERMINATED BY '$'
TRAILING NULLCOLS
(FIELD1,FIELD2,FIELD3,FIELD4,FIELD5,
NUMBER_FIELD "to_number(replace(:NUMBER_FIELD, '.', ','))",
FIELD6,FIELD7,FIELD8)
效果很好但0.3变为3,没有零。有什么问题?
谢谢
我按照建议更改了控制文件:
LOAD DATA
REPLACE
INTO TABLE USER.MYTABLE
FIELDS TERMINATED BY '$'
TRAILING NULLCOLS
(FIELD1 DECIMAL(6,0),
FIELD2 VARCHAR,
FIELD3 VARCHAR,
FIELD4 VARCHAR,
FIELD5 VARCHAR,
FIELD6 FLOAT,
FIELD7 FLOAT,
FIELD8 DATE,
FIELD9 VARCHAR)
这样的数据行:
1 $ 005 $ 05 $ 1 $ $ blablabla $ 0.50 0 $ 01/02/1996 $ 01
我有错误。
日志文件:
Column Name Position Len Term Encl Datatype
FIELD1 FIRST 4 PACKED DECIMAL (6, 0)
FIELD2 NEXT * VARCHAR
FIELD3 NEXT * VARCHAR
FIELD4 NEXT * VARCHAR
FIELD5 NEXT * VARCHAR
FIELD6 NEXT 4 FLOAT
FIELD7 NEXT 4 FLOAT
FIELD8 NEXT * $ DATE DD/MM/YYYY
FIELD9 NEXT * VARCHAR
答案 0 :(得分:1)
将数字存储为数字(它们没有以任何方式格式化,只存储值)会更好,然后您可以非常轻松地对它们执行所有数字操作,并且只在编写时格式化OUTPUT查询并从数据库中提取数据,可能是在对存储数据进行数字处理之后。
无论如何,下面我将说明如何从数字中获取不同的字符格式。查看to_char(number)
的Oracle文档以获取更多可能性。输出基于我的会话的NLS_NUMERIC_CHARACTERS,即。小数位数和千位分隔符。
select 0.3 as nmbr, to_char(0.3, '9.99') as str1, to_char(0.3, '0.00') as str2,
to_char(0.3, '0D0', 'nls_numeric_characters='',.''') as str3 from dual;
NMBR STR1 STR2 STR3
---------- ----- ----- ----
.3 .30 0.30 0,3
答案 1 :(得分:1)
您要查询号码的会话将其格式化为,3
,部分原因是您的NLS设置。从您的个人资料中,您在法国,因此您的NLS_NUMERIC_CHARACTER_SETTING将为',.'
,因此小数点分隔符为逗号。在SQL * Plus和SQL Developer工作表中,默认数字格式不显示前导零。如果要查看前导零,则需要指定格式:
select to_char(number_field, 'FM9990D999') from mytable
将使用您的会话的小数点分隔符;或强迫:
select to_char(number_field, 'FM9990D999', 'NLS_NUMERIC_CHARACTERS='',.''') from mytable
FM
个停靠点在小数点后面留下尾随零;如果你想看到那些,那就离开那个修饰语。
您在加载时所做的转换不是必需的;您可以将控制文件更改为:
NUMBER_FIELD FLOAT,
它将被自动视为一个数字(总是有一个句点小数分隔符)。这比将:NUMBER_FIELD
视为字符串,进行'十进制'替换,然后使用NLS设置转换为数字更清晰。
您还可以通过其他方式指定NLS设置:
NUMBER_FIELD "to_number(:NUMBER_FIELD, '9999D999', 'NLS_NUMERIC_CHARACTERS=''.,''')",
当您为to_number()
或to_char()
指定数字格式时,您显然需要在实际拥有的数据中为小数字符的每一边留出足够的0/9占位符。如果您不知道或不想指定数字位数,那么您可以在运行SQL * Loader之前将NLS_LANG设置为使用句点作为小数分隔符的区域,然后执行"to_number(:NUMBER_FIELD)"
。使用FLOAT
更简单。
答案 2 :(得分:0)
数字不能包含逗号。你要做的是使用to_number函数来创建一个字符串而不是一个数字。 to_char可能会产生你想要的结果