【问题标题】:Spooling sql to a CSV when data contains commas当数据包含逗号时将 sql 假脱机到 CSV
【发布时间】:2013-03-15 20:02:36
【问题描述】:

我正在尝试使用命令提示符将 sql 查询假脱机到 CSV 文件,但是我返回的一列数据在数据中包含逗号,并导致数据进入下一列。有没有办法解决这个问题?理想情况下,我希望在查询中间返回这个特定的列,而不是在最后。

我目前正在使用以下命令:

set termout off;
set colsep ',';
set underline off;
set feedback off;
set pagesize 0;
set linesize 1500;
set trimspool on;

我知道 set colsep ',' 命令是问题所在,但无法弄清楚用什么替换它。有人有什么建议吗?

另外,在我的 sql 查询之前,我正在使用 select 语句来提取标题信息。从对偶中选择'a,b,c';不确定这是否会对答案产生影响。

【问题讨论】:

  • 你用的是什么类型的sql?甲骨文?
  • 通过 Control M 中的命令作业运行 sql

标签: sql oracle sqlplus


【解决方案1】:

两个可能的答案。他们都不完美。如果某些结果中有逗号,但没有管道 (|),则可以切换到用管道分隔的

set colsep '|'

大多数可以读取csv 的软件都可以使用这种格式。

如果这对您不起作用,您可以意识到要在列中处理逗号,您需要将每个数据项括在引号中:

"data 1","data 2","data,with,commas"

为此,每个分隔符都需要为",",以便您可以

set colsep '","'

这不会在每行的开头和结尾使用引号,因此您可以使用 sed 将每一行括在引号中:

sed 's/^[^$]*$/"&"/' 

【讨论】:

  • 如果值包含引号,这将无法正常工作。 CSV 中的引号需要用双引号转义。例如 xyz"a" 需要转义为 xyz""a""
【解决方案2】:

您可以修改您的选择查询,如

select REPLACE(column_name, ',',' ') column name from table_name

这会将列数据中的逗号值替换为空格。

【讨论】:

    【解决方案3】:

    您可以修改返回结果集的查询,方法是用双引号将该列括起来。假设b 是罪魁祸首:

    select a
          , '"' || trim(B) || '"' as b
          , c
    from your_table;
    

    正确的语法当然取决于您的 RDBMS 版本。

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      相关资源
      最近更新 更多