How to Select a substring in Oracle SQL up to a specific character?
oracle, sql, substring, trim
Solution
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:
- SUBSTR
- INSTR
Addendum
If using Oracle10g+, you can use regex via REGEXP_SUBSTR.
Problem
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.