5

以下是我在表中的内容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    +
+++++++++++++++++++++++

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

4

3 回答 3

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;

演示

于 2012-06-22T11:48:26.773 回答
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 ;//

结果:

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),因此您可能希望将其更改为更长的数据。

于 2012-06-21T11:39:51.573 回答
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;
于 2012-06-21T09:48:47.453 回答