【问题标题】:SQL Substring \gSQL 子字符串 \g
【发布时间】:2018-08-08 05:55:31
【问题描述】:

我只想知道在此查询中我应该将\g 放在哪里?

SELECT project, 
SUBSTRING(address FROM 'A-Za-z') AS letters, 
SUBSTRING(address FROM '\d') AS numbers 
FROM repositories

我试过了,但这并没有返回任何结果(虽然它不会引发错误)

SELECT project, 
SUBSTRING(CONCAT(address, '#') FROM 'A-Za-z' FOR '#') AS letters, 
SUBSTRING(CONCAT(address, '#') FROM '\d' FOR '#') AS numbers 
FROM repositories

这是一个示例:我希望字符串 1DDsg6bXmh3W63FTVN4BLwuQ4HwiUk5hX 返回 DDsgbXmhWFTVNBLwuQHwiUkhX。所以基本上返回所有的字母......然后我的第二个是返回所有的数字。

【问题讨论】:

  • 你在使用 Postgres 吗?
  • 是的,但是我想知道是否有不使用任何postgresql函数的解决方案
  • 你应该告诉我们\g 应该做什么。我用过一点 Postgres,但我不知道发生了什么。
  • 所以正则表达式将返回第一个匹配项,\g 是一种使正则表达式返回每个匹配项的方法,而不仅仅是第一个匹配项
  • 所以你基本上想对给定的字符串多次应用正则表达式,并返回每个匹配项?对吗?

标签: sql regex postgresql


【解决方案1】:

正则表达式中的g(“全局”)修饰符表示应该使用所有匹配而不是只使用第一个。

这在substring 函数中没有多大意义,它只返回一个值,即第一个匹配项。所以没有办法将gsubstring一起使用。

在那些在 PostgreSQL 中有意义的函数(regexp_replaceregexp_matches)中,可以在可选的最后一个 flags 参数中指定 g

如果要查找与某个模式匹配的所有子字符串,请使用regexp_matches


对于您的示例,它与substring 完全无关,我会使用

SELECT translate('1DDsg6bXmh3W63FTVN4BLwuQ4HwiUk5hX', '0123456789', '');

         translate         
---------------------------
 DDsgbXmhWFTVNBLwuQHwiUkhX
(1 row)

【讨论】:

  • 我用一个例子更新了我的问题。您介意添加一个可以执行此操作的查询吗?我检查了 regexp_matches 但我无法让 'g' 工作
【解决方案2】:

所以这不是纯 SQL,而是 Postgresql,但这也可以完成工作:

SELECT project,
       regexp_replace(address, '[^A-Za-z]', '', 'g') AS letters,
       regexp_replace(address, '[^0-9]', '', 'g') AS numbers
FROM repositories;

【讨论】:

    猜你喜欢
    • 2014-03-21
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2021-05-27
    相关资源
    最近更新 更多