正则表达式 INSTR -Snowflake
Regex INSTR -Snowflake
我有一个与雪花查询相关的问题:
Oracle 查询:
INSTR(CFileName, '/', -1) + 1)
雪花查询
regexp_instr(CFileName, '/', -1) + 1
但是当我在 Snowflake 环境中 运行 这个时,我得到这个错误:
Invalid parameter value: -3. Reason: Position must be positive
你能告诉我如何阅读下面的代码吗?以及输出逻辑如何?
select regexp_instr('ygzff/afzfzh/yfzdaf/yftfrxdff/aa/ff', '/',3)+1
上面的答案是雪花7。 sf如何计算答案?
select
'ygzff/afzfzh/yfzdaf/yftfrxdff/aa/ff' as input,
regexp_instr(input, '/',1) as r1,
regexp_instr(input, '/',2) as r2,
regexp_instr(input, '/',3) as r3,
r3+1;
给出:
INPUT
R1
R2
R3
R3+1
ygzff/afzfzh/yfzdaf/yftfrxdff/aa/ff
6
6
6
7
我示例中的 1、2、3 是起始偏移量,结果是基于 1 的偏移量 /
,即 6。因此答案是 7
Oracle INSTR 位置 -1 表示从末尾开始计数,因此返回最后一个 '/' 实例之后的位置
我们可以翻转字符串,找到尾部,如果找到标记则减去,然后像这样使用:
select
'ygzff/afzfzh/yfzdaf/yftfrxdff/aa/ff' as input,
length(input) as l,
regexp_instr(reverse(input), '/') as r,
iff(r=0,0,l-(r-2)) as tp,
substr(input, tp) as tail;
INPUT
L
R
TP
TAIL
ygzff/afzfzh/yfzdaf/yftfrxdff/aa/ff
35
3
34
ff
或者您也可以使用 RIGHT
select
column1 as input,
length(input) as l,
regexp_instr(reverse(input), '/') as r,
right(input, iff(r=0,l,r-1))
from values
('ygzff/afzfzh/yfzdaf/yftfrxdff/aa/ff'),
('no slashes here');
INPUT
L
R
RIGHT(INPUT, IFF(R=0,L,R-1))
ygzff/afzfzh/yfzdaf/yftfrxdff/aa/ff
35
3
ff
no slashes here
15
0
no slashes here
我有一个与雪花查询相关的问题:
Oracle 查询:
INSTR(CFileName, '/', -1) + 1)
雪花查询
regexp_instr(CFileName, '/', -1) + 1
但是当我在 Snowflake 环境中 运行 这个时,我得到这个错误:
Invalid parameter value: -3. Reason: Position must be positive
你能告诉我如何阅读下面的代码吗?以及输出逻辑如何?
select regexp_instr('ygzff/afzfzh/yfzdaf/yftfrxdff/aa/ff', '/',3)+1
上面的答案是雪花7。 sf如何计算答案?
select
'ygzff/afzfzh/yfzdaf/yftfrxdff/aa/ff' as input,
regexp_instr(input, '/',1) as r1,
regexp_instr(input, '/',2) as r2,
regexp_instr(input, '/',3) as r3,
r3+1;
给出:
INPUT | R1 | R2 | R3 | R3+1 |
---|---|---|---|---|
ygzff/afzfzh/yfzdaf/yftfrxdff/aa/ff | 6 | 6 | 6 | 7 |
我示例中的 1、2、3 是起始偏移量,结果是基于 1 的偏移量 /
,即 6。因此答案是 7
Oracle INSTR 位置 -1 表示从末尾开始计数,因此返回最后一个 '/' 实例之后的位置
我们可以翻转字符串,找到尾部,如果找到标记则减去,然后像这样使用:
select
'ygzff/afzfzh/yfzdaf/yftfrxdff/aa/ff' as input,
length(input) as l,
regexp_instr(reverse(input), '/') as r,
iff(r=0,0,l-(r-2)) as tp,
substr(input, tp) as tail;
INPUT | L | R | TP | TAIL |
---|---|---|---|---|
ygzff/afzfzh/yfzdaf/yftfrxdff/aa/ff | 35 | 3 | 34 | ff |
或者您也可以使用 RIGHT
select
column1 as input,
length(input) as l,
regexp_instr(reverse(input), '/') as r,
right(input, iff(r=0,l,r-1))
from values
('ygzff/afzfzh/yfzdaf/yftfrxdff/aa/ff'),
('no slashes here');
INPUT | L | R | RIGHT(INPUT, IFF(R=0,L,R-1)) |
---|---|---|---|
ygzff/afzfzh/yfzdaf/yftfrxdff/aa/ff | 35 | 3 | ff |
no slashes here | 15 | 0 | no slashes here |