【问题标题】:Finding number position in string查找字符串中的数字位置
【发布时间】:2016-06-10 05:09:10
【问题描述】:

下面是我在表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    +
+++++++++++++++++++++++

知道如何实现这一目标吗?

【问题讨论】:

  • @xdazz : 感谢您的捕获...编辑相同..
  • @xdazz :你的答案是给我所有行的输出为 0。
  • @xdzz :在您的回答的帮助下,我得到了答案。看我的回答...
  • 嗯,我明白了。但是文本不包含数字怎么办?你会得到 999。
  • @xdazz :是的,在这种情况下,它会给我 999。见here

标签: mysql position


【解决方案1】:

在 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

【讨论】:

  • 当您评论我的回答时,为什么不直接在您的应用程序中执行此操作?这个查询不..优雅..
【解决方案2】:

如果您经常使用 MySQL 执行此操作,则最好使用 string functions SUBSTRING() 和 ASCII() 创建一个 Stored Function

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),因此您可能需要更改它以获得更长的数据。

【讨论】:

  • @Fahim 这不是问题要求的一部分。
【解决方案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;

【讨论】:

  • +1 MySQL 缺少与PATINDEX() 等效的任何内容,因此这与不使用正则表达式的情况一样接近(我猜这会更慢)
  • @xdazz :您的查询将所有行的输出都显示为 0...见here
  • 这不起作用,因为如果没有匹配,则 locate 返回 0。
猜你喜欢
  • 2012-12-24
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
相关资源
最近更新 更多