I\'ve posted this question on the new dba.stackexchange.com (please, let me know if I have to delete one).
I\'m working on a DB2 database, and as far as I can see re
Regarding your EDIT 2 solution:
SELECT *
FROM (SELECT 'afr923zs' MyString FROM SYSIBM.SYSDUMMY1) T
WHERE substr(MyString,1,1) = 'a'
AND substr(MyString,2,1) IN ('a','o','f','d','m','e','p')
AND substr(MyString,3,1) BETWEEN 'a' AND 'z'
AND (substr(MyString,4,1) BETWEEN 'a' AND 'z' OR substr(MyString,4,1) BETWEEN '0' AND '9')
AND (substr(MyString,5,1) BETWEEN 'a' AND 'z' OR substr(MyString,5,1) BETWEEN '0' AND '9')
AND (substr(MyString,6,1) BETWEEN 'a' AND 'z' OR substr(MyString,6,1) BETWEEN '0' AND '9')
AND (substr(MyString,7,1) BETWEEN 'a' AND 'z' OR substr(MyString,7,1) BETWEEN '0' AND '9')
AND substr(MyString,8,1) IN ('s','i','d','b','f','k','p','o')
;
You might consider using the LIKE operator when you have a long list of characters, or if you have multiple ranges. It can shorten and simplify the code:
SELECT *
FROM (SELECT 'afr923zs' MyString FROM SYSIBM.SYSDUMMY1) T
WHERE substr(MyString,1,1) = 'a'
AND 'aofdmep' like '%'||substr(MyString,2,1)||'%'
AND substr(MyString,3,1) BETWEEN 'a' AND 'z'
AND 'abcdefghijklmnopqrstuvwxyz0123456789' like '%'||substr(MyString,4,1)||'%'
AND 'abcdefghijklmnopqrstuvwxyz0123456789' like '%'||substr(MyString,5,1)||'%'
AND 'abcdefghijklmnopqrstuvwxyz0123456789' like '%'||substr(MyString,6,1)||'%'
AND 'abcdefghijklmnopqrstuvwxyz0123456789' like '%'||substr(MyString,7,1)||'%'
AND 'sidbfkpo' like '%'||substr(MyString,8,1)||'%'
;
For repeated character lists you could use a CROSS JOINed column constant:
SELECT *
FROM (SELECT 'afr923zs' MyString FROM SYSIBM.SYSDUMMY1) T
CROSS JOIN (SELECT 'abcdefghijklmnopqrstuvwxyz0123456789' alphanum FROM SYSIBM.SYSDUMMY1) T2
WHERE substr(MyString,1,1) = 'a'
AND 'aofdmep' like '%'||substr(MyString,2,1)||'%'
AND substr(MyString,3,1) BETWEEN 'a' AND 'z'
AND alphanum like '%'||substr(MyString,4,1)||'%'
AND alphanum like '%'||substr(MyString,5,1)||'%'
AND alphanum like '%'||substr(MyString,6,1)||'%'
AND alphanum like '%'||substr(MyString,7,1)||'%'
AND 'sidbfkpo' like '%'||substr(MyString,8,1)||'%'
;
Not needed for your example, but the CROSS JOINed "table" could define multiple named character class columns.