【问题标题】:Hash function sql哈希函数 sql
【发布时间】:2022-01-03 17:12:06
【问题描述】:

我想在我的表上创建一个哈希列。 我想将一行的所有值像连接一样放在该列中,并将 null 替换为任何符号。并且每个单元格都应该用分隔符分隔。

例如

A  B    C    D  HashColumn
1  2    Null 4  1/2/_/4
12 Null 4    5  12/_/4/5    

我想在多个表上执行此操作,因此需要对此进行动态查询。

请告诉我如何在 bigquery 中执行此操作

【问题讨论】:

    标签: sql hash google-bigquery


    【解决方案1】:

    我会推荐以下简单的方法

    select *, format('%t', t) HashColumn
    from your_table t      
    

    如果应用于您问题中的样本数据 - 输出是

    这对我来说看起来足够好。 但如果你真的需要问题中提到的格式 - 你可以做一些额外的字符串处理 - 例如

    select *, 
      replace(trim(format('%t', t), '()'), 'NULL', '_') HashColumn
    from your_table t
    

    在这种情况下 - 输出是

    【讨论】:

    • 很高兴它对您有用。如果有帮助,请考虑对答案进行投票:o)
    • @MikhailBerlynt 完成 :) 我实际上还想问一件事。现在我想在您共享的第一个查询中将 TRIM 函数应用于我的列。如果我做 TRIM(format('%t', t)) 它不起作用,如果我做 format('%t', TRIM(t)) 它给我错误,因为列是不同的数据类型,它只支持字符串和字节。你能告诉我一个解决方案吗?
    • 这种方法不允许您处理单个列,而是处理整行 - 这是这种方法的优点。如果您确实需要在列级别应用 TRIM - 您可以使用 Sergey 的答案,或者如果这仍然不适合您 - 请发布包含所有相关详细信息和数据示例的新问题,我们将尽力为您提供进一步帮助。好的? :o)
    【解决方案2】:

    试试这个:

    select IFNULL(CAST(A as string), '_') || '/' 
        || IFNULL(CAST(B as string), '_') || '/' 
        || IFNULL(CAST(C as string), '_') || '/' 
        || IFNULL(CAST(D as string), '_')
    from mytable
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-25
      • 2011-02-27
      • 2011-08-04
      • 2011-07-10
      • 2011-02-04
      • 2019-07-24
      • 2010-10-13
      • 2017-01-22
      相关资源
      最近更新 更多