将所有选定列转换为__char

时间:2015-07-22 09:38:49

标签: sql oracle pentaho kettle to-date

我在外部程序(Pentaho Data Integration(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()。

4 个答案:

答案 0 :(得分:2)

  

从example_table中选择TO_CHAR(*);

您不应在生产代码中使用*,这是一种糟糕的编码习惯。您应该明确提到要获取的列名称。

此外, TO_CHAR(*)毫无意义。如何将日期转换为字符串?您必须使用正确的格式模型

总之,使用优秀的文本编辑器列出列名称最多需要一两分钟。

答案 1 :(得分:2)

如果您正在寻找PDI中的解决方案,则需要创建一个作业(.kjb),在其中进行2次转换。 首先.ktr 会重建查询,秒.ktr 会执行新查询。

<强> 1。第一次转型:重建查询

enter image description here

  • 阅读源表步骤中的列(使用案例中的表输入步骤)。编写查询select * from example_table;并将行限制为0或1.这里的想法不是获取所有行,而是重新创建查询。
  • 使用元结构步骤获取表格的元结构。它将获取来自prev的列的列表。步骤。
  • 在“修改的JavaScript”步骤中,使用一小段代码检查列的数据类型是否为日期,然后将 to_Char(列)连接到行。
  • 最后将变量分组并设置为变量。

这是自动为您重新创建字段的点。现在,下一步是使用新查询执行此字段。

<强> 2。第二次转换:在下一步中使用此set变量来获取结果。 ${NWFIELDNAME}是您在上述转换中使用修改后的列设置的变量。

enter image description here

希望这会有所帮助:)

我已将第一个ktr的代码放在gist here中。

答案 2 :(得分:1)

我不能想象一个不了解实际数据类型的应用程序但是如果你真的想要自动化(gi)将所有列转换为字符串,我在Oracle中看到两种可能性:

  • 如果您的应用程序语言允许您指定绑定类型,则只需将所有输出变量绑定到字符串变量即可。 Oracle驱动程序除了将所有类型转换为字符串之外,例如可以使用jdbc(Java)。
  • 如果(看起来)你的应用程序语言不允许第一个解决方案,我能想到的最好的方法是为每个选择定义一个视图,你想要使用适当的TO_CHAR转换,然后从中选择视图。这些视图最终也可以使用一些PL / SQL从表存储库(user_table)自动生成。

另请注意,TO_CHAR会根据会话的NLS设置转换您的列,这可能会导致不需要的结果,因此您可能还希望始终指定如何转换:

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL;

答案 3 :(得分:1)

使用这两个表,您可以编写一个过程,查看每个表上的列,然后根据当前数据类型执行相应的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
        ...