5

我需要在 PostgreSQL 中构建一个查询,并且需要查找所有包含 6 位数字的文本条目(例如000999019290998981234567等)。问题是数字在字符串的开头或结尾不是必需的。

我试过但没有工作:

  • [0-9]{6}- 返回超过 6 位的数字的一部分
  • (?:(?<!\d)\d{6}(?!\d))- postgresql 不知道lookbehind
  • [^0-9][0-9]{6}[^0-9] 及其变化,但无济于事。

构建我自己的 Perl/C 函数并不是一个真正的选择,因为我没有所需的技能。知道目前可以使用什么正则表达式或其他让我无法理解的技巧吗?

编辑

输入样本:

  • aa 0011527 /CASA-> 不应该返回任何东西
  • aa 001152/CASA-> 应该返回001152
  • aa001152/CASA-> 应该返回001152
  • aa0011527/CASA-> 不应该返回任何东西
  • aa001152 /CASA-> 应该返回001152
4

2 回答 2

6

如果 PostgreSQL 支持单词边界,请使用\b

\b(\d{6})\b

编辑

\b在 PostgreSQL 中表示backspace,所以它不是单词边界。

http://www.postgresql.org/docs/8.3/interactive/functions-matching.html#FUNCTIONS-POSIX-REGEXP但是,它将向您解释您可以\y用作单词边界,因为它的意思是matches only at the beginning or end of a word,所以

\y(\d{6})\y

应该管用。

\m(\d{6})\M

也应该工作。

PostgreSQL 正则表达式中单词匹配的完整列表:

Escape  Description
\A      matches only at the beginning of the string (see Section 9.7.3.5 for how this differs from ^)
\m      matches only at the beginning of a word
\M      matches only at the end of a word
\y      matches only at the beginning or end of a word
\Y      matches only at a point that is not the beginning or end of a word
\Z      matches only at the end of the string (see Section 9.7.3.5 for how this differs from $)

新编辑:

根据您的编辑,您应该能够做到这一点:

(^|[^\d])(\d+)([^\d]|$)
于 2013-01-24T14:11:26.877 回答
0

使用@h2ooooooo 提出的建议,我设法创建了以下查询:

SELECT cleantwo."ID",cleantwo."Name",cleantwo."Code"
FROM
(
SELECT cleanone."ID",cleanone."Name",unnest(cleanone."Code") as "Code" -- 3. unnest all the entries received using regexp_matches (get all combinations)
FROM 
(
SELECT sd."ID", sd."Name", regexp_matches(sd."Name", '(^|[^\d])(\d+)([^\d]|$)')
    as "Code"
FROM "T_SOME_DATA" sd
WHERE substring(sd."Name" from 1 for 15) ~('(^|[^\d])(\d+)([^\d]|$)') -- 1. get all data possible
) as cleanone
WHERE cleanone."Code" IS NOT NULL -- 2. get data where code IS NOT NULL (remove useless entries)
) as cleantwo
WHERE length(cleantwo."Code")=6 -- 4. get only the combinations relevant to my initial requirement (codes with length 6)<br/>

我花了很多时间才找到这个,所以我希望它可以帮助遇到同样情况的其他人。祝你好运!

于 2013-01-24T15:10:46.420 回答