查找字符串中的数字位置

Fah*_*kar 5 mysql position

以下是我在表中的内容 myTable

+++++++++++++++
+ id + myWord +
+++++++++++++++
+  1 + AB123  +
+  2 + A413D  +
+  3 + X5231  +
+  4 + ABE921 +
+++++++++++++++
Run Code Online (Sandbox Code Playgroud)

当我执行

SELECT id, Locate('1',myWord) as myPos
FROM myTable;
Run Code Online (Sandbox Code Playgroud)

我得到1的位置.

+++++++++++++++
+ id + myPos  +
+++++++++++++++
+  1 + 3      +
+  2 + 3      +
+  3 + 5      +
+  4 + 6      +
+++++++++++++++
Run Code Online (Sandbox Code Playgroud)

我想要实现的是找到整数的第一个位置,这样我将得到低于输出.

+++++++++++++++++++++++
+ id + myWord + myPos +
+++++++++++++++++++++++
+  1 + AB123  +  3    +
+  2 + A413D  +  2    +
+  3 + X5231  +  2    +
+  4 + ABE921 +  4    +
+++++++++++++++++++++++
Run Code Online (Sandbox Code Playgroud)

任何想法我怎么能做到这一点?

Fah*_*kar 7

在xdazz答案的帮助下,我做了一些改动,最后得到了答案......

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;
Run Code Online (Sandbox Code Playgroud)

演示


gee*_*vdk 6

如果经常使用MySQL,最好使用字符串函数 SUBSTRING()和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 ;//
Run Code Online (Sandbox Code Playgroud)

结果:

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 |
+------+--------+-------+
Run Code Online (Sandbox Code Playgroud)

可以使用函数IFNULL()更改NULL结果.

请注意,该函数只接受CHAR(10),因此您可能希望更改更长的数据.

  • @Fahim这不是问题中要求的一部分. (3认同)