Emulate REGEXP like behaviour in SQL

前端 未结 5 548
野趣味
野趣味 2020-12-22 05:47

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

5条回答
  •  不知归路
    2020-12-22 06:45

    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.

提交回复
热议问题