将所有选定的列转换为_char
Posted
技术标签:
【中文标题】将所有选定的列转换为_char【英文标题】:Convert all selected columns to_char 【发布时间】:2015-07-22 09:38:48 【问题描述】:我在外部程序(Pentaho 数据集成 (PDI))中使用 Oracle SQL 查询。 我需要将所有列转换为字符串值,然后才能继续使用它们。
我正在寻找的是自动应用的东西
select to_date(col1), to_date(col2),..., to_date(colN) from example_table;
到所有列,这样你最多可以包装这个语句:
select * from example_table;
所有列都会自动转换。
解释:我需要这个,因为 PDI 在获取未转换的 DATE 列时似乎无法正常工作。由于我有动态查询,我不知道是否存在 DATE 列,只是想将所有列转换为字符串。
编辑
由于查询各不相同,而且我有很长的列表作为输入,我正在寻找一种更通用的方法,而不是在每列的前面手动写入 to_char()。
【问题讨论】:
使用 select to_char(col1),to_char(col2)...,to_char(coln) from example_table。 这种方法对我来说非常笨拙,因为我的查询和选择的列会因每个查询而改变。查询会自动从长表中读入。我进行了编辑以更准确地指定这一点。 【参考方案1】:如果您正在寻找 PDI 中的解决方案,您需要创建一个工作 (.kjb),在其中进行 2 次转换。 第一个 .ktr 将重建查询,第二个 .ktr 将执行新查询。
1.第一次转换: 重建查询
阅读源表步骤中的列(在您的情况下使用表输入步骤)。编写查询select * from example_table;
并将行限制为 0 或 1。这里的想法不是获取所有行,而是重新创建查询。
使用元结构步骤获取表格的元结构。它会为您获取从上一个进入的列列表。步骤。
在 Modified javascript 步骤中,使用一小段代码检查列的数据类型是否为 Date,然后将 to_Char(column) 连接到行。
最后将变量分组并设置成一个变量。
这是自动为您重新创建字段的地方。现在下一步是使用新查询执行此字段。
2。第二次转换: 在下一步中使用这个 set 变量来获得结果。 $NWFIELDNAME
是您在上述转换中使用修改后的列设置的变量。
希望这会有所帮助:)
我已将第一个 ktr 的代码放在 gist here 中。
【讨论】:
哇,太好了,我没想到会得到专门针对 pentaho 水壶的解决方案。我会仔细看看你的建议。看起来不错!【参考方案2】:从 example_table 中选择 TO_CHAR(*);
您不应该在生产代码中使用*
,这是一种不好的编码习惯。您应该明确提及要获取的列名。
另外,TO_CHAR(*) 没有意义。您如何将 date 转换为 string?您必须使用正确的格式模型。
总之,使用一个好的文本编辑器列出列名最多需要一两分钟。
【讨论】:
我有很多传入和不同的查询。如果我需要查找所有列名并将它们写下来以转换单个 DATE 列,那是可能的,但对我来说不是一个好的选择。我进行了编辑以澄清。【参考方案3】:我无法想象一个不知道实际数据类型的应用程序,但如果您真的想自动(gi)将所有列转换为字符串,我在 Oracle 中看到了两种可能性:
如果您的应用程序语言允许您指定绑定类型,您只需将所有输出变量绑定到一个字符串变量。 Oracle 驱动程序负责将所有类型转换为字符串,例如 jdbc (Java)。 如果(看起来)您的应用程序语言不允许第一个解决方案,我能想到的最好方法是为您想要使用的每个选择定义一个视图,并使用适当的 TO_CHAR 转换,然后从看法。这些视图最终也可以使用一些 PL/SQL 从表存储库 (user_table) 自动生成。还请注意,TO_CHAR 会根据您会话的 NLS 设置转换您的列,这可能会导致不需要的结果,因此您可能还需要始终指定转换方式:
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL;
【讨论】:
【参考方案4】:使用这两个表,您可以编写一个过程,查看每个表上的列,然后根据当前数据类型执行适当的 TO_CHAR
select * from user_tab_columns
select * from user_tables
伪代码
begin
loop on table -- user_tables
loop on column -- user_tab_columns
if current data_type = DATE then
lnewColumn = TO_CHAR(oldColumn...(
elsif current data_type = NUMBER then
...
【讨论】:
以上是关于将所有选定的列转换为_char的主要内容,如果未能解决你的问题,请参考以下文章