Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何比较具有不同数据类型组的两列_Sql_Hadoop_Hive_Cloudera_Hive Metastore - Fatal编程技术网

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
结束
如果这是不可能的,是否有一个解决方法来检索元数据并根据某些规则执行强制转换?例如,如果:

  • 第1列是BIGINT
  • 第2列是字符串
  • 然后将Column2强制转换为BIGINT,然后执行比较。需要最简单的解决方案。我希望不必对生成
    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怎么办。这可能是我最初的问题(见问题顶部的链接)所问的问题的解决方案。但是,我收到的答复指出,在转换过程中可能会有损失,这将打破比较。