假设我有一个表列,其结果如下:
ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore
Run Code Online (Sandbox Code Playgroud)
我希望能够编写一个从所述表中选择此列的查询,但只返回子字符串直到Underscore(_)字符.例如:
ABC
DEFGH
IJKLMNOP
Run Code Online (Sandbox Code Playgroud)
SUBSTRING函数似乎不适合任务,因为它是基于位置的,并且下划线的位置不同.
我想到了TRIM功能(特别是RTRIM功能):
SELECT RTRIM('listofchars' FROM somecolumn)
FROM sometable
Run Code Online (Sandbox Code Playgroud)
但是我不确定我是如何让它工作的,因为它似乎只删除了某个列表/一组字符,而我实际上只是在导致Underscore字符的字符之后.
从我的另一个问题,使用带有字符串限定符的REGEXP_SUBSTR,我试图决定哪种方法更好用.
由此产生的数据集只应delimters之前显示的字符串PLE,#并ALL以正确的顺序.包中已有的当前查询是这样的(DDL和DML位于帖子的底部):
SELECT DATA1
, DECODE(SIGN(0 - instr(DATA1, 'PLE')), -1, SUBSTR(DATA1, 1, instr(DATA1, 'PLE') - 1)) GET_DATA_TILL_FIRST_PLE
, DECODE(SIGN(0 - instr(DATA1, '#')), -1, SUBSTR(DATA1, 1, instr(DATA1, '#') - 1)) GET_DATA_TILL_FIRST_NUM_SIGN
, DECODE(SIGN(0 - instr(DATA1, 'ALL')), -1, SUBSTR(DATA1, 1, instr(DATA1, 'ALL') - 1)) GET_DATA_TILL_FIRST_ALL
, NVL(DECODE(SIGN(0 - instr(DATA1, 'PLE')), -1, SUBSTR(DATA1, 1, instr(DATA1, 'PLE') - 1), 0,
DECODE(SIGN(0 - instr(DATA1, '#')), -1, SUBSTR(DATA1, 1, instr(DATA1, '#') - 1), 0,
DECODE(SIGN(0 - instr(DATA1, 'ALL')), …Run Code Online (Sandbox Code Playgroud)