Finding number position in string

前端 未结 3 1010
再見小時候
再見小時候 2020-11-30 13:59

Below is what I have in table myTable

+++++++++++++++
+ id + myWord +
+++++++++++++++
+  1 + AB123  +
+  2 + A413D  +
+  3 + X5231  +
+  4 + ABE         


        
相关标签:
3条回答
  • 2020-11-30 14:43

    With help of xdazz answer, I did some changes and got answer finally...

    SELECT 
      myWord, 
      LEAST (
        if (Locate('0',myWord) >0,Locate('0',myWord),999),
        if (Locate('1',myWord) >0,Locate('1',myWord),999),
        if (Locate('2',myWord) >0,Locate('2',myWord),999),
        if (Locate('3',myWord) >0,Locate('3',myWord),999),
        if (Locate('4',myWord) >0,Locate('4',myWord),999),
        if (Locate('5',myWord) >0,Locate('5',myWord),999),
        if (Locate('6',myWord) >0,Locate('6',myWord),999),
        if (Locate('7',myWord) >0,Locate('7',myWord),999),
        if (Locate('8',myWord) >0,Locate('8',myWord),999),
        if (Locate('9',myWord) >0,Locate('9',myWord),999)
      ) as myPos
    FROM myTable;
    

    Demo

    0 讨论(0)
  • 2020-11-30 14:46

    Not smart, but I think you could do this:

    SELECT 
      id, 
      LEAST(
        Locate('0',myWord),
        Locate('1',myWord),
        Locate('2',myWord),
        Locate('3',myWord),
        Locate('4',myWord),
        Locate('5',myWord),
        Locate('6',myWord),
        Locate('7',myWord),
        Locate('8',myWord),
        Locate('9',myWord)
      ) as myPos
    FROM myTable;
    
    0 讨论(0)
  • 2020-11-30 14:48

    If you do this often with MySQL, you better make a Stored Function using the string functions SUBSTRING() and ASCII().

    DELIMITER //;
    CREATE FUNCTION find_first_int(pData CHAR(10))
      RETURNS INT
    BEGIN
      DECLARE vPos INT DEFAULT 1;
      DECLARE vRes INT DEFAULT 0;
      DECLARE vChar INT;
      WHILE vPos <= LENGTH(pData) DO
        SET vChar = ASCII(SUBSTR(pData, vPos, 1));
        IF vChar BETWEEN 48 AND 57 THEN
          RETURN vPos;
        END IF;
        SET vPos = vPos + 1;
      END WHILE;
      RETURN NULL;
    END//
    DELIMITER ;//
    

    The result:

    mysql> SELECT id, myWord, find_first_int(myWord) AS myPos FROM t1;
    +------+--------+-------+
    | id   | myWord | myPos |
    +------+--------+-------+
    |    1 | AB123  |     3 |
    |    2 | A413D  |     2 |
    |    3 | X5231  |     2 |
    |    4 | ABE921 |     4 |
    |    5 | ABC    |  NULL |
    +------+--------+-------+
    

    The NULL result can be changed using the function IFNULL().

    Note that the function only accepts CHAR(10), so you might want to change that for longer data.

    0 讨论(0)
提交回复
热议问题