以下是表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 +
+++++++++++++++++++++++
任何想法我怎么能做到这一点?
答案 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;
答案 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;