The following code shows my problem, I need to extract the JOBD value (with in reality variable and matches \w{1, 10}
with A (N, STR) as (
values
(1, 'SBMJOB MYJOB'),
(2, 'SBMJOB JOB '),
(3, 'SBMJOB JOB JOBD'),
(4, 'SBMJOB JOB4 JOBD '),
(5, 'SBMJOB JOB CMD('),
(6, 'SBMJOB JOB JOBD CMD('),
(7, 'SBMJOB JOB JOBD JOBQ('),
(8, 'SBMJOB JOB CMD('),
(9, 'SBMJOB JOB JOBQ(')
),
R (REGEX) as (
values
'sbmjob(?: +((?!\w+ *\()\w+))?(?: +((?!\w+\()\w+))?(?: +(\w+)\()?'
)
select N,
STR,
REGEXP_EXTRACT(STR, REGEX, 1, 1, 'i', 1) JOB,
REGEXP_EXTRACT(STR, REGEX, 1, 1, 'i', 2) JOBD,
length(REGEXP_EXTRACT(STR, REGEX, 1, 1, 'i', 2)) LENGTH_JOBD,
REGEXP_EXTRACT(STR, REGEX, 1, 1, 'i', 3) FIRST_KEYWORD
from A
cross join R
;
I expect it to returns this
| N | STR | JOB | JOBD | LENGTH_JOBD | FIRST_KEYWORD |
|---|---|---|---|---|---|
| 1 | SBMJOB MYJOB | MYJOB | null | null | null |
| 2 | SBMJOB JOB | JOB | null | null | null |
| 3 | SBMJOB JOB JOBD | JOB | JOBD | 4 | null |
| 4 | SBMJOB JOB4 JOBD | JOB4 | JOBD | 4 | null |
| 5 | SBMJOB JOB CMD( | JOB | null | null | CMD |
| 6 | SBMJOB JOB JOBD CMD( | JOB | JOBD | 4 | CMD |
| 7 | SBMJOB JOB JOBD JOBQ( | JOB | JOBD | 4 | JOBQ |
| 8 | SBMJOB JOB CMD( | JOB | null | null | CMD |
| 9 | SBMJOB JOB JOBQ( | JOB | null | null | JOBQ |
And it does with DB2 LUW (see fiddle)
But it returns this when using DB2 for IBMi
| N | STR | JOB | JOBD | LENGTH_JOBD | FIRST_KEYWORD |
|---|---|---|---|---|---|
| 1 | SBMJOB MYJOB | MYJOB | 0 | ||
| 2 | SBMJOB JOB | JOB | 0 | ||
| 3 | SBMJOB JOB JOBD | JOB | 0 | ||
| 4 | SBMJOB JOB4 JOBD | JOB4 | 0 | ||
| 5 | SBMJOB JOB CMD( | JOB | 0 | CMD | |
| 6 | SBMJOB JOB JOBD CMD( | JOB | 0 | ||
| 7 | SBMJOB JOB JOBD JOBQ( | JOB | 0 | ||
| 8 | SBMJOB JOB CMD( | JOB | 0 | CMD | |
| 9 | SBMJOB JOB JOBQ( | JOB | 0 | JOBQ |
I think I have to open a ticket but do you have any idea ?
DB2 LUWandDB2 for IBMiuse the same regex engine.