旧版ClickHouse如何在CSV格式化时用空串替代\N?
在旧版ClickHouse中实现CSV空值显示为空串
可以实现,以下是两种可靠方案:
1. 字段层面替换NULL为空串
针对查询中生成的Nullable字段,通过coalesce结合类型转换,直接将NULL值替换为空字符串。你的ds_1是数值类型的Nullable,先转成字符串再处理即可:
修改后的查询语句:
SELECT formattedTS, coalesce(toString(anyIf(toNullable(value), data_stream_id = 1)), '') AS ds_1 FROM ( SELECT ts, formatDateTime(ts, '%F %T', 'UTC') AS formattedTS, data_stream_id, avgMerge(avgValue) AS value FROM reporting_minute WHERE data_stream_id IN (1) GROUP BY data_stream_id, ts ORDER BY ts DESC, data_stream_id ASC ) GROUP BY ts, formattedTS ORDER BY ts DESC FORMAT CSV
如果有多个Nullable字段,对每个字段重复上述处理即可。这种方式不会误修改正常字段内容,是最安全的方案。
2. 全局替换结果中的\N
如果不想逐个处理字段,可以在查询结果外层用replaceRegexpAll替换所有\N为空串,但注意:若业务字段本身包含\N字符串,会被误替换,仅在确认无此类场景时使用:
SELECT replaceRegexpAll( (SELECT groupConcat(concat(toString(formattedTS), ',', toString(ds_1)), '\n') FROM ( SELECT formattedTS, anyIf(toNullable(value), data_stream_id = 1) AS ds_1 FROM ( SELECT ts, formatDateTime(ts, '%F %T', 'UTC') AS formattedTS, data_stream_id, avgMerge(avgValue) AS value FROM reporting_minute WHERE data_stream_id IN (1) GROUP BY data_stream_id, ts ORDER BY ts DESC, data_stream_id ASC ) GROUP BY ts, formattedTS ORDER BY ts DESC )), '\\N', '') FORMAT RawBLOB
该方式先将结果拼接成CSV格式的字符串,替换后输出,需用FORMAT RawBLOB避免额外转义。
内容的提问来源于stack exchange,提问作者Dmitriy Dumanskiy
相关产品推荐
相关产品推荐

