2008年6月13日 星期五

create User Define Function INSTR using DB2 UDB8.2


/*
 Create function INSTR
  iFind => Character you want to find
  iStr => String
  iOrder => if there are more than one character in string,
        which you want to find
  return location of that certain character
*/


DROP FUNCTION INSTR
GO
CREATE FUNCTION INSTR(iFind CHAR(1),iStr VARCHAR(1024),iOrder INTEGER)
RETURNS INTEGER
RETURN WITH N(COL,TXT,TXT1) AS (
    SELECT 1 COL,TXT,SUBSTR(TXT,1,1)
    FROM (SELECT iStr TXT
         FROM SYSIBM.SYSDUMMY1) T
    WHERE TXT > ''
    UNION ALL
    SELECT N.COL + 1,TXT,SUBSTR(TXT,N.COL+1,1)
    FROM N
    WHERE N.COL + 1 <= LENGTH(RTRIM(TXT))
    )
    SELECT COALESCE(COL,0) FROM
    (
     SELECT COL,TXT1,ROW_NUMBER() OVER() OD FROM N
     WHERE TXT1 = iFind
    ) T
    WHERE OD = iOrder;

-- test

SELECT INSTR(',','abcd,efghijkl,m',1) FROM SYSIBM.SYSDUMMY1;

==> Result

5


SELECT INSTR(',','abcd,efghijkl,m',2) FROM SYSIBM.SYSDUMMY1;

==> Result

14