Oracle 中的假脱机会在列中添加空格...我该如何避免呢?
Spooling in Oracle adds spaces to columns... how can I avoid it?
我将查询结果保存在一个 csv 文件中,但当数据库中的原始数据不包含这些字段时,一些字段中添加了不需要的空格。
例如,如果数据库中的某一行具有值 "how"、"are" 和 "you",我在假脱机处理后在文件中得到的是这样一行:
"how | are |you "
(小编不让多写空格,但是你可以想象有很多)
当我只希望它成为:
"how|are|you"
我试过几个设置选项都没有结果。有没有办法避免这些空间?提前致谢!
到目前为止我得到了什么:
SET ECHO OFF;
SET NEWP 0 SPACE 0 PAGES 0 FEED OFF HEAD OFF TRIMS OFF TRIM OFF TAB OFF;
set colsep '|';
set lines 130;
spool myfile.csv
SELECT * FROM SOME_TABLE;
spool off;
这进入了对 sqlplus 的调用。
您的 table 包含定义为 CHAR(nn)
的列,其中 用空格填充值 到完整长度,或者您的应用程序在字符串中存储了额外的空格.
使用 rtrim
删除尾随空格 - 代替
select c1||'|'||c2||'|'||c3
from tst;
使用
select rtrim(c1)||'|'||rtrim(c2)||'|'||rtrim(c3)
from tst;
如果前导和尾随都有空格,也可以使用 ltrim
select ltrim(rtrim(c1))||'|'||ltrim(rtrim(c2))||'|'||ltrim(rtrim(c3))
from tst;
更新
正如评论中指出的那样,可以使用 trim
函数代替
select trim(c1)||'|'||trim(c2)||'|'||trim(c3)
from tst;
感谢更新。所以你正在尝试这样的事情:
set colsep "|"
with demo as
( select 'Various' as col1, 'test' as col2, 'examples' as col3 from dual
union all select 'How', 'are', 'you' from dual )
select col1, col2, col3
from demo;
COL1 |COL2|COL3
-------|----|--------
Various|test|examples
How |are |you
不幸的是SQL*Plus 不是为像这样卸载数据而设计的 - 分隔符严格用于列。您必须自己将值与管道连接起来,例如col1 || '|' || col2 || '|' || col3
(注意列格式,例如日期)。
如果您在 Linux 或 Unix 上工作,请考虑:
sqlplus ***/***@*** << EOF | sed -e 's/[\t ]*[,$]/,/g' > outputfile.txt
set head off
set colsep ','
etc...
select whatever from sometable;
exit;
EOF
我将查询结果保存在一个 csv 文件中,但当数据库中的原始数据不包含这些字段时,一些字段中添加了不需要的空格。
例如,如果数据库中的某一行具有值 "how"、"are" 和 "you",我在假脱机处理后在文件中得到的是这样一行:
"how | are |you "
(小编不让多写空格,但是你可以想象有很多)
当我只希望它成为:
"how|are|you"
我试过几个设置选项都没有结果。有没有办法避免这些空间?提前致谢!
到目前为止我得到了什么:
SET ECHO OFF;
SET NEWP 0 SPACE 0 PAGES 0 FEED OFF HEAD OFF TRIMS OFF TRIM OFF TAB OFF;
set colsep '|';
set lines 130;
spool myfile.csv
SELECT * FROM SOME_TABLE;
spool off;
这进入了对 sqlplus 的调用。
您的 table 包含定义为 CHAR(nn)
的列,其中 用空格填充值 到完整长度,或者您的应用程序在字符串中存储了额外的空格.
使用 rtrim
删除尾随空格 - 代替
select c1||'|'||c2||'|'||c3
from tst;
使用
select rtrim(c1)||'|'||rtrim(c2)||'|'||rtrim(c3)
from tst;
如果前导和尾随都有空格,也可以使用 ltrim
select ltrim(rtrim(c1))||'|'||ltrim(rtrim(c2))||'|'||ltrim(rtrim(c3))
from tst;
更新
正如评论中指出的那样,可以使用 trim
函数代替
select trim(c1)||'|'||trim(c2)||'|'||trim(c3)
from tst;
感谢更新。所以你正在尝试这样的事情:
set colsep "|"
with demo as
( select 'Various' as col1, 'test' as col2, 'examples' as col3 from dual
union all select 'How', 'are', 'you' from dual )
select col1, col2, col3
from demo;
COL1 |COL2|COL3
-------|----|--------
Various|test|examples
How |are |you
不幸的是SQL*Plus 不是为像这样卸载数据而设计的 - 分隔符严格用于列。您必须自己将值与管道连接起来,例如col1 || '|' || col2 || '|' || col3
(注意列格式,例如日期)。
如果您在 Linux 或 Unix 上工作,请考虑:
sqlplus ***/***@*** << EOF | sed -e 's/[\t ]*[,$]/,/g' > outputfile.txt
set head off
set colsep ','
etc...
select whatever from sometable;
exit;
EOF