首页 > 解决方案 > 是否有函数将 ARGUMENT_SIGNATURE 转换为调用 drop 时使用的格式

问题描述

我无法以正确的格式获取信息模式 PROCEDURES 表的 ARGUMENT_SIGNATURE 以在 drop 语句中使用。

完整示例如下:

创建一个像

create or replace procedure proc1(P1 FLOAT, P2 FLOAT) returns string
    language javascript as $$ $$;

从信息架构/程序中选择:

SELECT PROCEDURE_NAME, ARGUMENT_SIGNATURE FROM TEST_DB.INFORMATION_SCHEMA.PROCEDURES
  WHERE PROCEDURE_NAME = 'PROC1' ;

产生以下结果

PROCEDURE_NAME ARGUMENT_SIGNATURE   
-------------- -------------------- 
PROC1          (P1 FLOAT, P2 FLOAT) 

用于删除 PROC1 过程的删除命令必须如下所示:

drop procedure PROC1 (FLOAT, FLOAT)

所以这里的问题是我如何从“(P1 FLOAT,P2 FLOAT)”到“(FLOAT,FLOAT)”?即是否有一个函数可以让我运行类似的东西:

SELECT PROCEDURE_NAME, ARGUMENT_SIGNATURE, SOMEFUNC(ARGUMENT_SIGNATURE) AS ARGTYPELIST
  FROM TEST_DB.INFORMATION_SCHEMA.PROCEDURES WHERE PROCEDURE_NAME = 'PROC1' ;

其中列 ARGTYPELIST 的格式为 (FLOAT, FLOAT)。

我曾尝试使用 regexp_replace 但似乎无法正确处理。也许有更好的方法?我需要这是一个纯 SQL 解决方案。字符“(”“)”不需要保留。一些预期的输出

"(P1 FLOAT, P2 FLOAT)"  --> "FLOAT,FLOAT"
"()"                    -->  ""
"(P1 FLOAT)"            --> "FLOAT"

标签: snowflake-cloud-data-platform

解决方案


这是一个正则表达式选项。它有点乱,但也会处理额外的空白。

SELECT REGEXP_REPLACE('(P1 FLOAT, P2 STRING)', '([(,]\\s*)\\w*\\s*(\\w*\\)?)', '\\1\\2'); 

退货

(FLOAT, STRING)

此版本将删除 Parens:

SELECT REGEXP_REPLACE('(P1 FLOAT, P2 STRING)', '\\(?([,]\\s*)?\\w*\\s*(\\w*)\\)?', '\\1\\2'); 

推荐阅读