在 SQL 中添加带有其他列子字符串的列(雪花)

Add column with substring of other column in SQL (Snowflake)

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

的很多口味有关

本质上我只想 trim 特定列的第一个字符。更一般地说,我要做的是用同一列的子字符串替换一列。我什至愿意创建一个新列,它是现有列的子字符串。我不知道如何做这些事情。

显而易见的解决方案是创建一个临时的 table,其中包含类似

的内容
CREATE TEMPORARY TABLE tmp_sub AS 
SELECT id_col, substr(id_col, 2, 10) AS id_col_sub FROM table1

然后加入它并写一个新的table

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

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

欢迎提出任何想法和建议。我谦虚地从一个对许多人似乎都精通的语言感到困惑的人的角度出发。

你没试过这个?

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

-保罗-

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

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

+-------+-----------------------------------------+
  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

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

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

无需指定长度,以下简单测试工具证明了这一点:

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

此处的两个表达式 - SUBSTR(, 2)RIGHT(, -2) - 有效删除 列值的第一个字符。

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

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