将所有选定的列转换为_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的主要内容,如果未能解决你的问题,请参考以下文章

【100分求解】 “char *”转换为“TCHAR * (提供所有代码 帮整理下 谢谢了 高手)

如何在SAS(大学)中将char字符转换为日期?

无法将char转换为int?

将包含熊猫系列的列转换为特征[重复]

将重复的行转换为mysql中的列

将具有日期格式的列中的所有行转换为文本格式