在 SQL 请求中,如何查找字符串最后一部分中包含数字的所有记录(最后一个空格之后)
Posted
技术标签:
【中文标题】在 SQL 请求中,如何查找字符串最后一部分中包含数字的所有记录(最后一个空格之后)【英文标题】:In a SQL request, how to find all the records that have digits in the last part of the string (after last whitespace) 【发布时间】:2018-02-03 00:16:23 【问题描述】:如果有人可以提供帮助,谢谢。
在我的表格中,我有一个街道列和一个数字列。但对于某些记录,房屋编号位于街道列中街道名称的末尾,以空格分隔。
根据 phpmyadmin 中的请求,如果此块包含任何数字,我想删除街道列的最后一个块(最后一个空格之后)并将此块放在数字列中。
我在 phpmyadmin 中输入该请求只是为了查找这些记录。
SELECT `street`,`number`
FROM `map`
WHERE `street` REGEXP '[\r\n\t\f\v ][0-9]+ ^[\r\n\t\f\v ]'
但请求不完整,因为它不只占用最后一个块,而且它也没有删除子字符串并放入数字列。
它应该如何工作的示例:(街道列,数字列):
('Rue van Malder 47B', '-1')
变为 ('Rue van Malder', '47B')
('Rue des 2 Arbres 511B', '-1')
变为 ('Rue des 2 Arbres', '511B')
->只有最后一个或多个数字的街区从街道移动到数字列
('place du 4 Août', '1')
保持 ('place du 4 Août', '1')
因为数字“4”不在最后一个块中
('751 2nd St', '-1')
保留 ('751 2nd St', '-1')
的原因与上述相同
【问题讨论】:
用您正在使用的数据库标记您的问题。 您不能在正则表达式中间使用^
。它匹配字符串的开头,所以它只在开头才有意义。
('Rue van Malder B47', '-1')
会变成('Rue van Malder', 'B47')
吗?
【参考方案1】:
Gordon Linoff,谢谢,您的回答已经是很好的回答要素,但我无法完全改变您的提议以更新我的领域。这个请求几乎可以用来填充数字列:
更新map
SET number
= substring_index(street
, ' ', -1)
WHERE street
IN (SELECT street
REGEXP '[0-9]+$')
但是缺少一些东西,因为像这样的字段:
('Bd de la 2e armée Britannique', '-1') 变为 ('Bd de la 2e armée Britannique', 'Britannique')
并且该元素不应该受到影响,因为数字不在字符串的最后一个块中
另外,我如何使用另一个 UPDATE 请求删除 street 列中的最后一个块,以最终在字段 street 中获得截断的字符串:
('Rue van Malder 47B', '-1') 变为 ('Rue van Malder', '47B')
谢谢
【讨论】:
【参考方案2】:在您的帮助 Gordon Linoff 以及在 google 上的一些搜索下,我确切地找到了我需要的请求,我将在这里解释它以获取最终的帮助:
更新地图
SET number
= substring_index(street
, ' ', -1),
street
= LEFT(street
, LENGTH(street
) - LENGTH(substring_index(street
, ' ', -1))-1)
WHERE street
REGEXP '[\r\n\t\f\v][0-9]+[a-zA-Z]*$'
首先,我在“地图”表中更新 2 列:数字和街道:
-number 从最后一个空格中找到字符串的最后一部分 -street 是通过将其替换为删除整个“街道”字符串的子字符串来找到的,即数字部分的长度(我们之前刚刚创建的部分) -REGEXP 表示:
$ 表示我们必须触摸字符串的末尾 [\r\n\t\f\v ] : 一个空格(没有符号 + 或 * 表示我们只搜索一个空格) [0-9] : 一个数字(+ 号表示我们搜索 1 到无限位数字) [a-zA-Z] : 一个字母(* 符号表示我们搜索 0 到无限个字母)所以这个 REGEXP 总是会取最后一个空格后的最后一个块,因为我们要搜索一个空格,1 个或多个数字,0 个或多个字母,$ 表示末尾。
【讨论】:
【参考方案3】:您似乎正在使用 mysql。如果是这样,这非常接近:
select (case when substring_index(street, ' ', -1) + 0 > 0
then substring_index(street, ' ', -1)
end)
如果街道以 34xyz 结束,那么这将输入 34。对于您的版本,只是一个数字:
select (case when street regexp ' [0-9]+$'
then substring_index(street, ' ', -1)
end)
更新将如下所示:
update t
set num = substring_index(street, ' ', -1) + 0
where street regexp ' [0-9]+$';
【讨论】:
他说他用的是phpMyAdmin,所以他应该用MySQL。 Right Barmar,我正在使用 Mysql。谢谢 Gordon Linoff,我会试试的,你能更新一下把那个子字符串放在数字列吗? @Jonathan 。 . .我不知道为什么我在答案中写了“SQL Server”。答案中的语法都是MySQL。 SQL Server 甚至不支持正则表达式。 Gordon Linoff,谢谢,我是 MySQL 和 Regex 的新手,你的回答已经是一个很好的答案,但我无法改变你的提议来更新我的字段。这个请求几乎可以填充数字列:UPDATEmap
SET number
= substring_index(street
, ' ', -1) WHERE street
IN (SELECT street
REGEXP '[0-9]+$ '【参考方案4】:
除了UPDATE
等,我认为你需要2个步骤来确定最后一个单词是否有数字:
WHERE street REGEXP "[[:space:]][^[:space:]0-9]+$"
当最后一个单词不包含数字时应该为TRUE。注意:我正在检查前导、尾随、 或 嵌入数字。问题的陈述以及示例在这方面是模棱两可的。
之后,您可以使用类似这样的方法来提取最后一个单词:
SUBSTRING_INDEX(street, ' ', -1)
但这仅适用于“空格”,不适用于[[:space:]]
中的一般“空白”。 你真的需要用一种完全支持正则表达式的语言来完成这项任务。(注意:MariaDB 在这方面比 MySQL 好,但仍然可能不足。)
【讨论】:
以上是关于在 SQL 请求中,如何查找字符串最后一部分中包含数字的所有记录(最后一个空格之后)的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2008 查询以查找列中包含非字母数字字符的行