需要从源表中获取布尔类型列作为 varchar 并在 Amazon redshift 的目标表中存储为 varchar

Posted

技术标签:

【中文标题】需要从源表中获取布尔类型列作为 varchar 并在 Amazon redshift 的目标表中存储为 varchar【英文标题】:Need to fetch Boolean type column as varchar from source table and store as varchar in target table in Amazon redshift 【发布时间】:2021-08-31 09:57:59 【问题描述】:

我已经使用 redshift 一个月了。我需要你的帮助;

我需要使用源表创建一个目标表(将表目标创建为从源中选择 *),源表中有一个布尔类型的列,我需要将该列作为 varchar 存储在目标表中。尝试了很多方法,如 cast、convert ..etc 对我没有任何帮助。经过大量搜索后,我知道布尔值无法转换为 redshift 中的另一种数据类型。

它显示以下错误;

亚马逊无效操作:列“indicator”是 布尔类型,但表达式的类型是字符变化; [SQL State=42804, DB Errorcode=500310] 1 条语句失败。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

以下方法可能适用于您的情况。

从源表中加载数据时,您不是使用SELECT * 选择所有列,而是显式调用各个列并为布尔列使用case expression 并评估实际数据并将结果作为字符串返回'true''false'

create table target as select colA, colB, case boolColC when true then 'true' else 'false' end from source

【讨论】:

谢谢 Sivakumar - 这很有帮助。【参考方案2】:

如果你不能直接从 Boolean 转换为 varchar,你可以使用

CASE 
    WHEN boolCol= TRUE THEN 'True'
    WHEN boolCol= FALSE THEN 'False'
    ELSE 'Unknown'
END AS boolCol

回避转换的需要。

【讨论】:

感谢您的回答,但使用大小写效果不佳。我试过更新查询; update table set indicator= case indicator when true then 'true' when false then 'false' else 'N/A' end ------- 它抛出这个错误“[Amazon](500310) Invalid operation: column”indicator " 是布尔类型,但表达式是文本类型;[SQL 状态=42804,数据库错误代码=500310] 1 条语句失败。" 需要按照 Sivakumar 的建议在创建表时完成。这样,您的列将使用 varchar 类型而不是 boolean 类型创建。我的回答应该更清楚。您应该删除并重新创建您的表,这将是最简单的解决方案。 可以是 jist WHEN boolColWHEN NOT boolCol。该列已经是布尔值,您不需要与 TRUE 或 FALSE 进行比较来产生另一个布尔结果 没错,但这更多的是优化问题。我发现当使用并没有真正表明该列是布尔值的列名时,这种方式更具可读性(与例如“IsAvailable”不同)。【参考方案3】:

我能够在创建表时使用嵌套 case 语句解决问题 - 我在此处发布解决方案,以便对其他人也有帮助。

case 
  when name in ('a', 'b') then 
  case offline_crt when true then 'true' else 'false' end
  else 'N/A'
  end as indicator

【讨论】:

以上是关于需要从源表中获取布尔类型列作为 varchar 并在 Amazon redshift 的目标表中存储为 varchar的主要内容,如果未能解决你的问题,请参考以下文章

Pentaho 数据集成 (PDI):将布尔值从源插入到目标

FORALL 插入目标表,然后从源表中删除 FORALL

ODI修改主键后刷新失败解决方案

sql 从源表中删除行时,删除$ TA表中的相应行

SQL - 从源表中提取某些记录,但也交叉引用该表

Oracle Merge Sql 在目标中插入并从源中删除