Mariadb

在 MariaDB 中的某些位置開始和結束的字元串中查找重複的字母?

  • August 26, 2022

我需要在第 4 到第 10 位之間找到所有包含雙字母的字元串。

我可以通過以下方式找到所有雙字母

'([a-zA-Z])\1{1,3}';

和職位

SELECT SUBSTRING(columnmame, 4, 9 ) FROM mytable;

但我不知道如何將它們結合起來?

以便找到以下範例:

Liverpool;
Sheffield Central.

但不是

Arran.

我努力了

WITH cte AS (
   SELECT *, SUBSTRING(columnmame, 4, 9) AS c
   FROM mytable
)

SELECT *
FROM cte
WHERE c REGEX '([a-zA-Z])\1{1,3}';

我知道 MariaDB 不支持反向引用,例如 ‘\1’。

'^.{3,8}(\w)\1'

解釋 -

^ -- anchored at start
.{3,8} -- match 3 to 8 characters (may not be the exact numbers you need)
(\w) -- (or (\[[:ALPHA:]] or ([a-zA-Z]) -- match 1 letter
\1   -- match the same string that was matched by (...)
(And don't care about what occurs afterward.

對於 MySQL 8,反斜杠需要加倍。

一個簡單的解決方案是創建一個僅包含 4 到 10 值的數字表,如下所示:

CREATE TABLE Numbers (
nr INT );
 
insert into Numbers values 
(4),(5),(6),(7),(8),(9),(10);  

然後使用:

SELECT *
FROM   myTable
WHERE  EXISTS (SELECT *
              FROM   Numbers
              WHERE  nr < LENGTH(col)
              AND SUBSTRING(col, nr, 1) = SUBSTRING(col, nr + 1, 1)
             )   ;

小提琴

僅當SUBSTRING(col, nr, 1) = SUBSTRING(col, nr + 1, 1)有兩個連續的相同單詞時才會返回行。根據第 4 到第 10 部分,它受數字表上的值的限制

引用自:https://dba.stackexchange.com/questions/316037