查找字符串中的数字位置

时间:2012-06-21 09:39:39

标签: mysql position

以下是表myTable

中的内容
+++++++++++++++
+ id + myWord +
+++++++++++++++
+  1 + AB123  +
+  2 + A413D  +
+  3 + X5231  +
+  4 + ABE921 +
+++++++++++++++

执行时

SELECT id, Locate('1',myWord) as myPos
FROM myTable;

我获得了1的位置。

+++++++++++++++
+ id + myPos  +
+++++++++++++++
+  1 + 3      +
+  2 + 3      +
+  3 + 5      +
+  4 + 6      +
+++++++++++++++

我想要实现的是找到整数的第一个位置,这样我的输出就会低于输出。

+++++++++++++++++++++++
+ id + myWord + myPos +
+++++++++++++++++++++++
+  1 + AB123  +  3    +
+  2 + A413D  +  2    +
+  3 + X5231  +  2    +
+  4 + ABE921 +  4    +
+++++++++++++++++++++++

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

3 个答案:

答案 0 :(得分: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;

Demo

答案 1 :(得分:6)

如果您经常使用MySQL,最好使用Stored Function SUBSTRING()和ASCII()来制作string functions

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 ;//

结果:

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 |
+------+--------+-------+

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

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

答案 2 :(得分:3)

不聪明,但我认为你可以这样做:

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;