我在MySQL数据库的表行中有这些字符串:
XO0071050-MERTINLK
XO6071050的备份
我需要检查字符串的第三个字符是否为零,在这种情况下用零替换零。
我试过没有成功 MySQL INSTR功能和 LOCATE功能。
如何解决这个问题?
你能帮助我吗?
提前感谢您的帮助,非常感谢。
答案 0 :(得分:0)
我觉得应该有更好的LEFT
和RIGHT
组合,但这应该有效:
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()
,特别是在搜索模式更为复杂的情况下。查询愉快!