我有一个Snowflake表,其中一列包含值[6326.72,-548.99,-80.29].我需要使用SELECT语句创建三个新列,COL1的值为6326.72,COL2的值为-548.99,COL3的值为-80.29.

我try 使用正则表达式-?\d+\.+\d+来实现这一点,但由于某些原因,它没有返回正确的结果.有没有人能建议在Snowflake REGEXP_SUBSTR中使用正则表达式的要求?

SELECT REGEXP_SUBSTR('[6326.72, -548.99, -80.29]', '-?\d+\.+\d+', 1, 1) AS col1,
       REGEXP_SUBSTR('[6326.72, -548.99, -80.29]', '-?\d+\.+\d+', 1, 2) AS col2,
       REGEXP_SUBSTR('[6326.72, -548.99, -80.29]', '-?\d+\.+\d+', 1, 3) AS col3;

谢谢!

推荐答案

我不认为你需要REGECP来做这个.这应该会得到您预期的结果:

SELECT split( trim( '[6326.72, -548.99, -80.29]' , '[]' )  ,',') x,
 x[0]::varchar col1,
 x[1]::varchar col2,
 x[2]::varchar col3;

+--------------------------------------------+---------+----------+---------+
|                     X                      |  COL1   |   COL2   |  COL3   |
+--------------------------------------------+---------+----------+---------+
| [   "6326.72",   " -548.99",   " -80.29" ] | 6326.72 |  -548.99 |  -80.29 |
+--------------------------------------------+---------+----------+---------+

拆分:https://docs.snowflake.com/en/sql-reference/functions/split

修剪:https://docs.snowflake.com/en/sql-reference/functions/trim

无论如何,以下是REGEXP版本:

SELECT REGEXP_SUBSTR('[6326.72, -548.99, -80.29]', '([^\\[\\], ]+)', 1, 1) AS col1,
       REGEXP_SUBSTR('[6326.72, -548.99, -80.29]', '([^\\[\\], ]+)', 1, 2) AS col2,
       REGEXP_SUBSTR('[6326.72, -548.99, -80.29]', '([^\\[\\], ]+)', 1, 3) AS col3;

Sql相关问答推荐

如何使用LinkHouse群组ArrayInsertAt以零作为位置参数

在SQL Server中使用LEFT连接包含特定记录

SQL查询以条件空值跟踪生产操作结果进展

SUM(条件)在Oracle?

使用WHERE子句进行筛选时,SQL SELECT查询返回总计数

NULL-生成的列中连接的字符串的输入

Oracle 23c ROUND,数据类型为DATE

SQL Athena/prest判断值是否在嵌套的json数组中

WooCommerce产品的SQL查询:获取sku和产品标签

删除所有订单中可用的重复值

PostgreSQL中递归CTE查询的故障过滤

PostgreSQL:从多个字段收集特定指标的最后一个条目

如何查询自引用 comments 表以查找带有回复的 comments ,并按最新回复排序?

将表格和字符串连接以 for each 记录生成订单项目

在多个表上递归查找

如何防止 SQL 中的负收入值并将其重新分配到接下来的月份?

如何从 2 个 SQLite 表构建嵌套对象?

使用标准SQL 触发更新当前日期

SQL 计数和过滤查询优化

如何根据 ID 和指标从 2 个表中找到不同的值?