需要从源表中获取布尔类型列作为 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 类型创建。我的回答应该更清楚。您应该删除并重新创建您的表,这将是最简单的解决方案。 可以是 jistWHEN boolCol
和 WHEN 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的主要内容,如果未能解决你的问题,请参考以下文章