【问题标题】:Add column with substring of other column in SQL (Snowflake)在 SQL (Snowflake) 中添加具有其他列的子字符串的列
【发布时间】:2019-11-15 03:56:53
【问题描述】:

我觉得这应该很简单,但我在 SQL 方面相对不熟练,我似乎无法弄清楚。我习惯于在 python (pandas) 或 Spark (通常是 pyspark) 中处理数据,这将是其中任何一个中的一个单行。具体来说,我使用的是 Snowflake SQL,但我认为这可能与许多 SQL 风格有关。

基本上我只是想从特定列中删除第一个字符。更一般地说,我想要做的是用同一列的子字符串替换一列。我什至会满足于创建一个新列,它是现有列的子字符串。我不知道如何做这些事情。

显而易见的解决方案是创建一个带有类似

的临时表
CREATE TEMPORARY TABLE tmp_sub AS 
SELECT id_col, substr(id_col, 2, 10) AS id_col_sub FROM table1

然后加入它并写一个新表

CREATE TABLE table2 AS
SELECT 
b.id_col_sub as id_col,
a.some_col1, a.some_col2, ...
FROM table1 a
JOIN tmp_sub b
ON a.id_col = b.id_col

不过,我的表大约有十亿行,这感觉效率极低。也许我错了?也许这只是正确的方法吗?我想我可以将CREATE TABLE table2 AS... 替换为INSERT OVERWRITE INTO table1 ...,至少这样不会存储整个内容的额外副本。

欢迎任何想法和想法。我谦虚地站在一个被许多人似乎已经掌握的语言所迷惑的人的角度。

【问题讨论】:

    标签: sql snowflake-cloud-data-platform


    【解决方案1】:

    我不确定 Snowflake 中的确切语法/功能,但一般来说有几种不同的方法可以实现这一点。 我想普遍适用的一般方法是使用任何数据库中都可用的 SUBSTRING 函数。

    假设您有一个名为 Table1 的表,其中包含以下数据:

    +-------+-----------------------------------------+
      Code  | Desc
    +-------+-----------------------------------------+
     0001   | 1First Character Will be Removed
     0002   | xCharacter to be Removed
    +-------+-----------------------------------------+
    

    删除第一个字符的 SQL 代码是:

    select SUBSTRING(Desc,2,len(desc)) from Table1
    

    请注意,"SUBSTRING" 函数可能因不同的数据库而异。例如,在 Oracle 中,函数是 "SUBSTR"。你只需要找到雪花通讯员。

    另一种至少适用于 SQLServer 和 MySQL 的方法是使用 "RIGHT" 函数

    select RIGHT(Desc,len(Desc) - 1) from Table1
    

    根据您的问题,我假设您实际上想要更新表中的实际数据。在这种情况下,您可以在更新语句中使用上述相同的函数。

    update Table1 set Desc = SUBSTRING(Desc,2,len(desc))
    

    【讨论】:

    • 这正是我想要的。 SET非常感谢。
    • 这太棒了!感谢您的帮助,如果您有兴趣,如果您是 Snowflake 的注册用户,Snowflake 社区有 Select Star 计划可以为您的个人资料添加积分,如果您有兴趣,请查看页面并注册:community.snowflake.com/s/selectstar
    【解决方案2】:

    你没试过吗?

    UPDATE tableX
       SET columnY = substr(columnY, 2, 10 ) ;
    

    -保罗-

    【讨论】:

      【解决方案3】:

      不需要指定长度,从以下简单的测试工具中可以看出:

      SELECT $1 ,SUBSTR($1, 2) ,RIGHT($1, -2) FROM VALUES ('abcde') ,('bcd') ,('cdef') ,('defghi') ,('e') ,('fg') ,('') ;

      这里的两个表达式 - SUBSTR(, 2)RIGHT(, -2) - 有效地删除了

      的第一个字符列值。

      至于使用 UPDATE 与 INSERT OVERWRITE 的策略,我认为性能或结果不会有任何差异,因此我可能会选择 UPDATE,因为它更简单。所以,总而言之,我会使用:

      UPDATE tableX SET columnY = SUBSTR(columnY, 2) ;

      【讨论】:

        猜你喜欢
        • 2016-11-02
        • 2019-01-27
        • 1970-01-01
        • 2020-04-08
        • 1970-01-01
        • 2021-07-12
        • 2023-03-19
        • 2021-01-30
        • 1970-01-01
        相关资源
        最近更新 更多