如果字符串用引号括起来 " 或 '。我必须删除 snowflake 中的那些开始和结束引号

If a string is enclosed in quotes either " or '. I have to remove those starting and ending quotes in snowflake

检查以下 input/output 个示例:

  1. 输入:""Nag"ndra"" -> 预期输出:"Nag"ndra"
  2. 输入:'N'agendra -> 预期输出 'N'agendra

我尝试了以下查询来实现该行为,它能够删除开始和结束引号。

select regexp_replace('""Nag"endra""','^["\']|["\']$','') from dual

对于第二个例子,它被给出为 N'agendra 它应该是 'N'agendra

如果您想保留开头 ' 则不要在正则表达式中使用它。这对我有用:

select regexp_replace('""Nag"endra""','^["]|["\']$',''); -- "Nag"endra"
select regexp_replace('\'N\'agendra','^["]|["\']$',''); -- 'N'agendra

注意我从 ^["\'].

中删除了 '

如果正则表达式风格支持对表达式内捕获组的反向引用,您可以匹配字符串开头的定界符并在末尾引用它,然后替换为第二个捕获组的内容:

SELECT REGEXP_REPLACE( '""Nag"ndra""', '^(["\'])(.*)\1$', '' );

如果不支持,但在替换部分支持反向引用,则可以使用两次调用。例如:

SELECT REGEXP_REPLACE( '""Nag"ndra""', '^"(.*)"$', '' );
SELECT REGEXP_REPLACE( '\'N\'agendra', '^\'(.*)\'$', '' );

您可能想先测试是否存在一对匹配的引号,然后 select 如果您只想删除外部引号对,那么在这种情况下您需要的引号对。

编辑 如果两者都不支持,您可以使用条件表达式和您自己的表达式。您必须先确保开头的引号与末尾匹配:

SELECT IF(
    '""Nag"ndra""' REGEXP '^".*"$|^\'.*\'$',
    REGEXP_REPLACE( '""Nag"ndra""', '^["\']|["\']$', '' ), 
    '""Nag"ndra""'
);

您可以只使用逻辑,分解后看它是否有效:

SELECT 
    column1,
    LEFT(column1,1) as first_char,
    RIGHT(column1,1) as last_char,
    SUBSTR(column1,2, LENGTH(column1)+2) as truncated,
    IFF(first_char = last_char AND (first_char = '"' OR first_char = '\''), truncated, column1) as cleaned
FROM values ('""Nag"ndra""'), ('\'N\'agendra '); 

给出:

COLUMN1 FIRST_CHAR LAST_CHAR TRUNCATED CLEANED
""Nag"ndra"" " " "Nag"ndra"" "Nag"ndra""
'N'agendra ' N'agendra 'N'agendra

并将其组合在一起:

SELECT 
    column1,
    IFF(LEFT(column1,1) = RIGHT(column1,1) AND LEFT(column1,1) in ('"', '\''), SUBSTR(column1,2, LENGTH(column1)+2), column1) as cleaned

给出:

第 1 列 |已清理 --|-- ""Nag"ndra"" |"Nag"ndra"" 'N'agendra |'N'agendra FROM values ('""Nag"ndra""'), (''N'agendra');