sql >> データベース >  >> RDS >> Mysql

不規則な形式の文字列の途中から数値を返す

    これはMySQLの重要なタスクであり、正規表現の一致を返すための組み込み関数はありません。しかし、正確に13桁を探しているので、次のようにすることができます(明らかに、これをチェックする必要のある位置の数に拡張します...

    -- setup test
    CREATE TABLE t (foo VARCHAR(30));
    INSERT INTO t VALUES 
    ('1938420985390asdfih')
    ,('1234812934810dflkasd')
    ,('asdfasldkjfaasdfjasd')
    ,('asd;flkjaklsdf')
    ,('adfsdf1234073927357sdapjfas')
    ,('1/4sdikhsd')
    
    
    SELECT CASE
           WHEN SUBSTR(foo,1,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,1,13)
           WHEN SUBSTR(foo,2,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,2,13)
           WHEN SUBSTR(foo,3,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,3,13)
           WHEN SUBSTR(foo,4,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,4,13)
           WHEN SUBSTR(foo,5,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,5,13)
           WHEN SUBSTR(foo,6,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,6,13)
           WHEN SUBSTR(foo,7,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,7,13)
           WHEN SUBSTR(foo,8,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,8,13)
           WHEN SUBSTR(foo,9,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,9,13)
           END AS digits
      FROM t
    
    -------------------
    1938420985390
    1234812934810
    (NULL)
    (NULL)
    1234073927357
    (NULL) 
    

    いいえ、きれいではありません。ただし、これを拡張して、妥当な長さの文字列を効果的に「スキャン」できるはずです。

    注:正規表現は、13文字の部分文字列全体が正確に13文字で構成されていることを確認しています。各文字は、10進数(0から9)です。



    1. AzureSQLデータベースに移行するメリットのトップ5

    2. MySQLでのINTERVALとCURDATEの操作

    3. 別のユーザーとしてMySQLにログインする方法は?

    4. AJAXを使用して選択オプションの選択でPHPクエリを実行するにはどうすればよいですか?