在 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 的新手,你的回答已经是一个很好的答案,但我无法改变你的提议来更新我的字段。这个请求几乎可以填充数字列:UPDATE map 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 查询以查找列中包含非字母数字字符的行

在另一个字段Oracle SQL中包含的一个字段中查找文本

java如何返回一个字符串中包含某字符的个数?

如何在 GraphQL 中包含突变请求元数据?

如何在 SELECT 部分中包含 BIT 类型列而不在 T-SQL 中的 GROUP BY 中包含它?

SQL Server如何查找表名或列名中包含空格的表和列