sql - 如何在外部表中设置参数?

标签 sql linux oracle

我正在尝试使用 SQL 从 csv 文件创建一个外部表。 csv 文件具有以下结构:

I001234
I012344
I000234
...

我为上传写了这段代码:

create table Arranger_check(
matriid char(8))
organization external (
type oracle_loader default directory ext_tab_data access parameters
(
records delimited by newline 
)
location('file.csv')) reject limit unlimited;

如果我尝试询问 db,结果是错误的。我有八位数字,最后一位是空格 32(ascii)。结果是带有 IN 或 NOT IN 的查询不起作用。

matriid
--------
I001234
I012344
I000234
...

我尝试更改 char(7) 中的 matriid char(8),但创建表上传了 0 行。

最佳答案

如果您将您的列定义为 char(8) 那么它将始终用空格填充,无论文件中的值是否有空格:如果我使文件混合:

create table Arranger_check(
matriid char2(8))
...

select matriid, length(matriid), dump(matriid) as dumped
from Arranger_check;

MATRIID  LENGTH(MATRIID) DUMPED                                  
-------- --------------- ----------------------------------------
I001234                8 Typ=96 Len=8: 73,48,48,49,50,51,52,32   
I012344                8 Typ=96 Len=8: 73,48,49,50,51,52,52,32   
I000234                8 Typ=96 Len=8: 73,48,48,48,50,51,52,32   

对于 varchar2,如果文件有尾随空格,列值将只有空格,因此对于具有混合的同一文件,您会在表中得到不同的长度:

create table Arranger_check(
matriid varchar2(8))
...

select matriid, length(matriid), dump(matriid) as dumped
from Arranger_check;

MATRIID  LENGTH(MATRIID) DUMPED                                  
-------- --------------- ----------------------------------------
I001234                8 Typ=1 Len=8: 73,48,48,49,50,51,52,32    
I012344                7 Typ=1 Len=7: 73,48,49,50,51,52,52       
I000234                7 Typ=1 Len=7: 73,48,48,48,50,51,52       

如果您希望列值没有尾随空格,即使文件值有尾随空格,如果它们存在,您需要将它们剪掉:

create table Arranger_check(
matriid varchar2(8))
organization external (
type oracle_loader default directory ext_tab_data access parameters
(
  records delimited by newline
  fields
  (
    matriid char(8) rtrim
  )
)
location('file.csv')) reject limit unlimited;

然后在同一个文件中混合使用带空格和不带空格的值:

select matriid, length(matriid), dump(matriid) as dumped
from Arranger_check;

MATRIID  LENGTH(MATRIID) DUMPED                                  
-------- --------------- ----------------------------------------
I001234                7 Typ=1 Len=7: 73,48,48,49,50,51,52       
I012344                7 Typ=1 Len=7: 73,48,49,50,51,52,52       
I000234                7 Typ=1 Len=7: 73,48,48,48,50,51,52       

请注意,如果您坚持使用 char(8)rtrim 将没有实际效果,因为正是这种数据类型导致所有值都被重新填充空格到列的完整大小。您需要使用 varchar2(8)

关于sql - 如何在外部表中设置参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52531957/

相关文章:

mysql - 编写一个 sql 查询以使用来自另一列的子字符串将列添加到数据框

linux - 从 Matlab 启动 Linux 终端

regex - sed 正则表达式提取字段并构建新的

oracle - 错误 : ORA-12154: TNS:could not resolve the connect identifier specified

sql - 在 SQL 中减去变量

MySQL - 1 主列表不在表 2 中但在表 3 中

linux - 删除字符串直到 shell 脚本中第二次出现

甲骨文12c : Functions in the WITH Clause do not work with ADODB

sql - Oracle 按分钟分组

sql - 如何查看日期是否在当前月份的SQL Server中?