REGEXP_SUBSTR在Snowflake中,正则表达式将在句点(出现0-2次)之后提取字符串

mfpqipee  于 2023-04-22  发布在  其他
关注(0)|答案(2)|浏览(139)

我尝试在Snowflake中使用REGEXP_SUBSTR方法来提取句点之后的字符串。我有以下可能性:

  • ALTER TABLE DATABASE_NAME.SCHEMA_NAME.TABLE_NAME ADD COLUMN ....
  • ALTER TABLE SCHEMA_NAME.TABLE_NAME ADD COLUMN ....
  • ALTER TABLE TABLE_NAME ADD COLUMN ....

对于以下可能性,我需要能够提取TABLE_NAME。到目前为止,我已经尝试了这种方法,它能够获得第三种可能性:

select regexp_substr(query_text, 'ALTER TABLE ([0-9A-Za-z\\-\\_]+) ADD COLUMN', 1,1, 'e', 1);

我不知道如何在一个正则表达式中捕获所有三种可能性。如果有任何提示,我将不胜感激。谢谢。

dy1byipe

dy1byipe1#

使用regexp和split_part:

WITH cte(query_text) AS (
   SELECT 'ALTER TABLE DATABASE_NAME.SCHEMA_NAME.TABLE_NAME ADD COLUMN ....' UNION
   SELECT 'ALTER TABLE SCHEMA_NAME.TABLE_NAME ADD COLUMN ....' UNION
   SELECT 'ALTER TABLE TABLE_NAME ADD COLUMN ....'
)
select 
  regexp_substr(query_text, 'ALTER TABLE (.+) ADD COLUMN', 1,1, 'e', 1) as obj_name,
  split_part(obj_name, '.', -1) AS tab_name,
  split_part(obj_name, '.', -2) AS schema_name,
  split_part(obj_name, '.', -3) AS db_name
FROM cte;

输出:
| OBJ_NAME|TAB_NAME|SCHEMA_NAME|数据库名称|
| --------------|--------------|--------------|--------------|
| DATABASE_NAME.SCHEMA_NAME.TABLE_NAME|表名|SCHEMA_NAME|数据库名称|
| SCHEMA_NAME.TABLE_NAME|表名|SCHEMA_NAME||
| 表名|表名|||

brc7rcf0

brc7rcf02#

select regexp_substr(query_text, 'ALTER TABLE ([0-9A-Za-z\\-\\_.]+\.)?([0-9A-Za-z\\-\\_]+) ADD COLUMN', 1, 1, 'e', 2);

他会做你描述的事情。

select regexp_substr(query_text, 'ALTER TABLE (["0-9A-Za-z\\-\\_.]+\.)?"?([0-9A-Za-z\\-\\_]+)"? ADD COLUMN', 1, 1, 'e', 2);

如果表名在引号中,也将提取表名。

相关问题