用于查找字符的MySQL INSTR函数或LOCATE函数?

时间:2017-09-22 10:23:22

标签: mysql

我在MySQL数据库的表行中有这些字符串:

  

XO0071050-MERTINLK

     

XO6071050的备份

我需要检查字符串的第三个字符是否为零,在这种情况下用零替换零。

我试过没有成功 MySQL INSTR功能 LOCATE功能

如何解决这个问题?

你能帮助我吗?

提前感谢您的帮助,非常感谢。

2 个答案:

答案 0 :(得分:0)

我觉得应该有更好的LEFTRIGHT组合,但这应该有效:

SELECT CASE WHEN LEFT(RIGHT(youstring, LENGTH(yourstring) - 2), 1) = 0
            THEN CONCAT(LEFT(yourstring, 2), 6, RIGHT(yourstring, LENGTH(yourstring)-3))
            ELSE yourstring END
  FROM table

CASE检查你的String的3 CHAR为0,如果是,则将其替换为6.它将所有其他0都保留为

答案 1 :(得分:0)

INSTR()LOCATE()函数返回子字符串的 position 。但是,规定的任务要求在已知位置测试(长度为1的)子字符串。因此,INSTR()LOCATE()在这里无济于事。

SUBSTR()函数(又称SUBSTRING()对于该目的很有用:在WHERE子句测试中应用它。对于UPDATE语句中的SET字段分配,INSERT()函数可以解决问题。

最后,解决方案非常简单。由于我本人曾经摸索过此类问题,因此我会在这里具体,逐步地解决问题。那些不在SQL字符串处理学习阶段之外的人无需再阅读。

假设您有MyTable表,其中包含您在MyString列中描述的字符串,例如

mysql> SELECT * FROM MyTable;
+----+--------------------+
| id | MyString           |
+----+--------------------+
|  1 | XO0071050-MERTINLK |
|  2 | XO6071050-BACKUPS  |
|  3 | XO0071050-FOO      |
|  4 | XO6071050-BAR      |
+----+--------------------+
4 rows in set (0.00 sec)

然后,以下代码返回您需要更新的行:

mysql> SELECT * FROM MyTable WHERE SUBSTR(MyString, 3, 1) = '0';
+----+--------------------+
| id | MyString           |
+----+--------------------+
|  1 | XO0071050-MERTINLK |
|  3 | XO0071050-FOO      |
+----+--------------------+
2 rows in set (0.00 sec)

MySQL的好人在SUBSTR()上记录的this page函数的三参数形式是SUBSTR(str, pos, len):其中 str 是源字符串, pos 是所需子字符串的位置(从1开始计数),而 len 是要返回的子字符串的长度。 “长度”是字符,而不是字节,因此1的长度是单个字符。

因此,以上语句通读了您的字符串表,并返回第三个MyString字符为0的行。由于您已经知道所讨论字符(“ 3”)的位置,该位置大概保持不变,因此您无需采取任何进一步的欺骗手段即可实现目标。

现在,要获得所需的字符串,请使用INSERT()将第三个字符替换为'6'。 (不要与INSERT [INTO] tbl_name语句类型混淆。)以下是SELECT语句中的示例:

mysql> SELECT INSERT('XO0071050-FOO', 3, 1, '6') AS 'TestString';
+---------------+
| TestString    |
+---------------+
| XO6071050-FOO |
+---------------+
1 row in set (0.00 sec)

此函数的四参数形式为INSERT(str, pos, len, newstr) ...与SUBSTR()相似,只是它具有第四个参数 newstr 来指定“插入”子字符串。返回的字符串将 newstr 插入 str 中,替换从位置 pos 开始的子字符串,并替换 len 个字符。在上方,被定义为从位置3开始且长度为1的子字符串(即第一个0)被单字符子字符串6替换。

最后,让我们将两者放到UPDATE语句中:

mysql> UPDATE MyTable
    -> SET MyString = INSERT(MyString, 3, 1, '6')
    -> WHERE SUBSTR(MyString, 3, 1) = '0';
Query OK, 2 rows affected (0.01 sec)
Rows matched: 2  Changed: 2  Warnings: 0

现在运行上面的前两个查询将为我们提供:

mysql> SELECT * FROM MyTable;
+----+--------------------+
| id | MyString           |
+----+--------------------+
|  1 | XO6071050-MERTINLK |
|  2 | XO6071050-BACKUPS  |
|  3 | XO6071050-FOO      |
|  4 | XO6071050-BAR      |
+----+--------------------+
4 rows in set (0.00 sec)

然后

mysql> SELECT * FROM MyTable WHERE SUBSTR(MyString, 3, 1) = '0';
Empty set (0.00 sec)

可能有比此解决方案更精巧的解决方案。为了学习,我在这里尝试使其简单。而且,我坚持使用至少从MySQL 5开始就已经存在的字符串函数。那些拥有MySQL 8并了解正则表达式的人可能会改用REGEXP_REPLACE(),特别是在搜索模式更为复杂的情况下。查询愉快!