Sql 如何比较具有不同数据类型组的两列
这是我昨天提出的一个问题的延伸: 在配置单元中,是否可以在Sql 如何比较具有不同数据类型组的两列,sql,hadoop,hive,cloudera,hive-metastore,Sql,Hadoop,Hive,Cloudera,Hive Metastore,这是我昨天提出的一个问题的延伸: 在配置单元中,是否可以在SELECT子句中内联的不同数据类型组中的两列之间执行比较?我需要首先确定每个列的传入元数据是什么,然后提供选择要使用的CAST的逻辑 CASE WHEN Column1 <=> Column2 THEN 0 -- Error occurs here if data types are in different data type groups (i.e., BIGINT <=> STRING)
SELECT
子句中内联的不同数据类型组中的两列之间执行比较?我需要首先确定每个列的传入元数据是什么,然后提供选择要使用的CAST
的逻辑
CASE
WHEN Column1 <=> Column2 THEN 0 -- Error occurs here if data types are in different data type groups (i.e., BIGINT <=> STRING)
ELSE 1
END
案例
当Column1 Column2时,如果数据类型位于不同的数据类型组(即BIGINT STRING)中,则在此处发生错误
其他1
结束
如果这是不可能的,是否有一个解决方法来检索元数据并根据某些规则执行强制转换?例如,如果:
SELECT
语句的底层系统进行实质性的代码更改
更新2:
有一个后端系统生成SQOOP查询,在该系统中有一个函数修改SELECT子句以比较两列。我们遇到的问题是,以前在我们运行的HIVE/Cloudera的早期版本中,列被隐式转换。现在我们正在升级到不支持隐式数据类型转换的版本,我们需要找到最简单的解决方案来继续支持数据类型转换。不幸的是,后端中没有可用的元数据,因此我尝试在
SELECT
子句中对其进行破解隐式转换是个好主意:
CASE
WHEN Column1 <=> cast(Column2 as bigint) THEN 0
ELSE 1
END
案例
当Column1强制转换(Column2作为bigint)时,则0
其他1
结束
如果无法强制转换,则强制转换的结果为空。嗯,是的。但是,我需要能够检查Column2的传入元数据,然后才能确定将
转换为哪种数据类型。我已经更新了我的问题以提供更多细节。@JWeezy当然可以。如果您知道列名(并且需要知道它们),那么它们的类型有什么问题?您是如何知道没有类型的列名的?我们使用后端生成SQOOP查询。有一个函数可以修改SELECT
子句中的某些行。我想对这个函数进行更改。我已经更新了我的问题。@JWeezy如果您总是将两列都转换为STRING怎么办。这可能是我最初的问题(见问题顶部的链接)所问的问题的解决方案。但是,我收到的答复指出,在转换过程中可能会有损失,这将打破比较。