我请求连接并使用嵌套的select和list()的firebird,然后将其写入文件。第一个命令是SET HEADING OFF;
SET HEADING OFF;
SELECT DISTINCT '"' || REPLACE(TRIM(COALESCE(x.column, '')), '"', '""')
|| '"; "' || REPLACE(TRIM(COALESCE(x.column2, '')), '"', '""')
|| '"; "' || REPLACE(TRIM(COALESCE(list(DISTINCT x.column3, ','), '')), '"', '""')
|| '";'
FROM (
SELECT ycolumn AS column, ycolumn1 AS column1, ycolumn2 AS column2, list(DISTINCT ycolumn3, ',') AS column3
FROM (
SELECT d.column AS ycolumn, c.column1 AS ycolumn1, dc.column2 AS ycolumn2, ws.column3 AS ycolumn3
FROM ...
)y
GROUP BY ycolumn, ycolumn1, ycolumn2
) x
GROUP BY x.column, x.column1, x.column3
;
问题是嵌套SELECT的标头未禁用,并且输出文件如下:
==============================================================================
0:218
==============================================================================
CONCATENATION:
"field"; "field1"; "field2"; "field3";
是否可以禁用所有请求的标头?
答案 0 :(得分:0)
问题是LIST
产生BLOB SUB_TYPE TEXT
,而ISQL默认使用配置BLOBDISPLAY
设置为1
的配置(显示BLOB SUB_TYPE TEXT
)。使用此设置,ISQL将自动在每行内联输出所有文本blob,但是要辨别是哪个blob,在显示blob内容时它将包括列别名。
您可以使用SET BLOBDISPLAY OFF
关闭blobdisplay,但是查询结果将仅显示blob-id,而不显示blob内容,这可能不是您想要的。对于您问题中的查询,只会显示:
0:218
另一种方法是将查询转换为足够大的VARCHAR
:
SELECT DISTINCT cast('"' || REPLACE(TRIM(COALESCE(x.column, '')), '"', '""')
|| '"; "' || REPLACE(TRIM(COALESCE(x.column2, '')), '"', '""')
|| '"; "' || REPLACE(TRIM(COALESCE(list(DISTINCT x.column3, ','), '')), '"', '""')
|| '";' as varchar(8191))
FROM ...
对于字符集UTF8,最大VARCHAR
的大小是8191,对于单字节字符集,最大#output
的大小是32765,但是行长度还有其他限制(最大64KB)。