Say I have a table column that has results like:
ABC_blahblahblah DEFGH_moreblahblahblah IJKLMNOP_moremoremoremore
I would like to be able to write a query that selects this column from said table, but only returns the substring up to the Underscore (_) character. For example:
ABC DEFGH IJKLMNOP
The SUBSTRING function doesn’t seem to be up to the task because it is position-based and the position of the underscore varies.
I thought about the TRIM function (the RTRIM function specifically):
SELECT RTRIM('listofchars' FROM somecolumn) FROM sometable
But I’m not sure how I’d get this to work since it only seems to remove a certain list/set of characters and I’m really only after the characters leading up to the Underscore character.
Advertisement
Answer
Using a combination of SUBSTR, INSTR, and NVL (for strings without an underscore) will return what you want:
SELECT NVL(SUBSTR('ABC_blah', 0, INSTR('ABC_blah', '_')-1), 'ABC_blah') AS output FROM DUAL
Result:
output ------ ABC
Use:
SELECT NVL(SUBSTR(t.column, 0, INSTR(t.column, '_')-1), t.column) AS output FROM YOUR_TABLE t
Reference:
Addendum
If using Oracle10g+, you can use regex via REGEXP_SUBSTR.