在一行中追加查询结果
Posted
技术标签:
【中文标题】在一行中追加查询结果【英文标题】:Append results of a query in a single line 【发布时间】:2012-07-06 08:13:55 【问题描述】:我正在将查询结果卸载到文件中。我需要将结果记录显示在一行中。例如,
unload to file.unl select col from table where col = "test";
生成的 file.unl 会是这样的
test|
test|
....
test|
但我想得到的是,
test|test|test|....|test|
感谢任何指导或想法。
谢谢
【问题讨论】:
这将工作***.com/a/11356573/1216425 @teran:你能解释一下 FOR XML PATH .. 在 4gl 中是必需的吗? 抱歉,我没有注意到您使用的是 4gl。上面的答案是针对 MS SQL 的; 【参考方案1】:您可能知道您可以在 SQL 中或通过 DBDELIMITER 环境变量声明 DELIMITER "|"
。据我所知,没有办法将默认的 record 终止符从 NEWLINE
更改为其他任何内容。
所以我怀疑您需要编写一个自定义函数来遍历结果并将它们附加到一个变量中,然后将其写入文件,或者编写一个单独的脚本,您可以通过 RUN
调用将数据从行旋转到列,例如:
UNLOAD TO file.unl SELECT col FROM table WHERE ...;
RUN "/usr/bin/perl -ni -e 'chomp; print' file.unl";
我假设您在 Unix 上运行并且有 perl。如果你不这样做,你可能会发现迭代器建议比在 Windows 上安装 perl 更实用,特别是如果你对运行此代码的机器的控制有限。
更新
我的 4GL 很生锈,但我在描述一些非常基本的东西,例如:
DEFINE command CHAR(10100)
DEFINE long_string CHAR(10000)
DECLARE curs1 CURSOR FOR
SELECT col FROM table WHERE ...
FOREACH curs1 INTO col1
LET long_string = long_string CLIPPED || col1 CLIPPED || '|'
END FOREACH
LET command = "echo '" || long_string CLIPPED || "' > file.unl"
RUN command
自从我编写任何 4GL 以来,已经有 15 年或更长时间了,所以请最多将其视为伪代码。可能有更好的方法可以直接写入文件,我真的不记得了。
【讨论】:
我使用 Perl 已经有一段时间了。有没有办法在不使用脚本的情况下做到这一点? 用简单的迭代器示例更新了答案。我仍然认为 perl 版本更好;它的代码更少,也更不容易被意外的 shell 解释破坏。 我已经稍微修正了 I4GL 代码。 Perl 机制,除了最后一个换行符之外的所有内容都变平了; I4GL 代码很脆弱,容易溢出。 一个用于定义或抑制记录结束标记的 HPL 或 UNLOAD 选项将是可取的!【参考方案2】:创建表#表( PKey INT 主键, 字段 VARCHAR(10) )
插入#Table 选择 1, 'ABS1' UNION ALL 选择 2, 'ABS2' UNION ALL 选择 3, 'ABS3'
声明@results VARCHAR(MAX) = ''
选择 @结果 = 合并( @结果 + '|' + 场, @结果 ) 来自#Table
选择@结果
【讨论】:
这是什么语言??为什么在结果之前使用@?请解释一下。 这是一个 sql 查询。结果之前的 @ 意味着我正在创建一个 varchar 变量来连接我的所有结果。我最终选择了那个变量作为我的结果。 @Sarah:感谢您的解释。请理解我使用 Informix-4GL 进行查询。 我明白了,它看起来很像sql。@
和 #
表示法是 MS SQL Server(或可能是 Sybase),与 Informix-4GL 几乎没有关系。以上是关于在一行中追加查询结果的主要内容,如果未能解决你的问题,请参考以下文章