如果字符串用引号括起来 " 或 '。我必须删除 snowflake 中的那些开始和结束引号
If a string is enclosed in quotes either " or '. I have to remove those starting and ending quotes in snowflake
检查以下 input/output 个示例:
- 输入:
""Nag"ndra""
-> 预期输出:"Nag"ndra"
- 输入:
'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');
检查以下 input/output 个示例:
- 输入:
""Nag"ndra""
-> 预期输出:"Nag"ndra"
- 输入:
'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');