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

MySQLの列から正規表現に一致するテキストを抽出する方法はありますか?

    これは、mysql regex機能では不可能です(そのために設計されているように見えるいくつかのudfをインストールしない限り)。技術的には、[0-9]は限定されたセットであるため、10個のLOCATEをスローできます。 LEASTの (0に注意して無効にする)、SUBSTRINGを使用します 。きれいな絵ではありません:

    SET @var ='asjdasd35433';
    SELECT SUBSTRING(@var,1,
      LEAST(
        IF(LOCATE(0,@var)=0,LENGTH(@var),LOCATE(0,@var)),
        IF(LOCATE(1,@var)=0,LENGTH(@var),LOCATE(1,@var)),
        IF(LOCATE(2,@var)=0,LENGTH(@var),LOCATE(2,@var)),
        IF(LOCATE(3,@var)=0,LENGTH(@var),LOCATE(3,@var)),
        IF(LOCATE(4,@var)=0,LENGTH(@var),LOCATE(4,@var)),
        IF(LOCATE(5,@var)=0,LENGTH(@var),LOCATE(5,@var)),
        IF(LOCATE(6,@var)=0,LENGTH(@var),LOCATE(6,@var)),
        IF(LOCATE(7,@var)=0,LENGTH(@var),LOCATE(7,@var)),
        IF(LOCATE(8,@var)=0,LENGTH(@var),LOCATE(8,@var)),
        IF(LOCATE(9,@var)=0,LENGTH(@var),LOCATE(9,@var))
       ) -1 ) as 'result';
    +---------+
    | result  |
    +---------+
    | asjdasd | 
    +---------+
    

    必要の場合 それはudfを見てください。それ以外の場合は、フィールドをフェッチしてMySQLの外部で操作する方がよいでしょう。

    編集:数値が整数に収まる場合 、汚いハッカーは次の結果になる可能性があります:

    SET @var ='asjdasd35433';
    SELECT SUBSTRING(@var,1,LENGTH(@var)-LENGTH(CAST(REVERSE(@var) as UNSIGNED)));
    +---------+
    | result  |
    +---------+
    | asjdasd |
    +---------+
    


    1. SQLServerのCHARとVARCHARの違いは何ですか-SQLServer/T-SQLチュートリアルパート31

    2. ClassNotFoundException:oracle.jdbc.OracleDriver

    3. 特定のグループに属していないユーザーを照会しますか? (EXCEPTを使用したかったが、MySQLはそれをサポートしていないようです)

    4. SQLServerのマルチステートメントテーブル値関数とインラインテーブル値関数の違い