正则表达式 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