Search code examples
sqloracle-databasesubstringtrim

How to Select a substring in Oracle SQL up to a specific character?


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.


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:

    Addendum

    If using Oracle10g+, you can use regex via REGEXP_SUBSTR.