我试图弄清楚如何对concat regexp进行分组。
查看我想做什么的示例(但请记住,我有数千行,所以我不能一一做到):

first_name
  Maria05aa
  John89bcb
  George07
  Angie53cs


我的结果如下所示:

colummn_a       column_b     column_c
Maria.05.aa     Maria.aa       05
John8.a9.bcb    John.bcb       a9
George.07       George         07
Angie.b53.cs    Angiecs        b53


如何获得这些结果?

最佳答案

首先,我将引用this question的答案,即找到字符串中第一个数字的位置。您可以调整同一查询以找到字符串中最后一个数字的位置。因此,首先,我计算了这些值:

SELECT first_name,
  LEAST(
    if (LOCATE('0', first_name) > 0, LOCATE('0', first_name), 101),
    if (LOCATE('1', first_name) > 0, LOCATE('1', first_name), 101),
    if (LOCATE('2', first_name) > 0, LOCATE('2', first_name), 101),
    if (LOCATE('3', first_name) > 0, LOCATE('3', first_name), 101),
    if (LOCATE('4', first_name) > 0, LOCATE('4', first_name), 101),
    if (LOCATE('5', first_name) > 0, LOCATE('5', first_name), 101),
    if (LOCATE('6', first_name) > 0, LOCATE('6', first_name), 101),
    if (LOCATE('7', first_name) > 0, LOCATE('7', first_name), 101),
    if (LOCATE('8', first_name) > 0, LOCATE('8', first_name), 101),
    if (LOCATE('9', first_name) > 0, LOCATE('9', first_name), 101)
  ) AS firstNumberIndex,
  GREATEST(
    LOCATE('0', first_name),
    LOCATE('1', first_name),
    LOCATE('2', first_name),
    LOCATE('3', first_name),
    LOCATE('4', first_name),
    LOCATE('5', first_name),
    LOCATE('6', first_name),
    LOCATE('7', first_name),
    LOCATE('8', first_name),
    LOCATE('9', first_name)
  ) AS lastNumberIndex
FROM myTable;


我将最大值任意设置为101,因为我将字符串列的长度设置为100,所以我选择了一个不存在的索引。

有了这些字符串后,我将其用作子查询来获取第一个数字左侧,最后一个数字右侧以及之间的子字符串,以获取所需的列,如下所示:

SELECT SUBSTRING(first_name, 1, firstNumberIndex - 1) AS firstPiece,
   SUBSTRING(first_name, firstNumberIndex, (lastNumberIndex - firstNumberIndex + 1)) AS numbers,
   SUBSTRING(first_name, lastNumberIndex + 1) AS lastPiece
FROM(
    mySubquery) tmp;


然后,剩下要做的就是以所需的格式将它们放在一起。同样,我使用了子查询来使其更具可读性,但由于所有数据都来自同一表,因此该子查询不是必需的。但是,对于某些复杂的事情,我认为可读性是一个重要的折衷。我注意到您不希望在空子字符串之前添加句点,因此我不得不编写一些CASE语句:

SELECT
  CASE
    WHEN numbers = '' THEN firstPirce
    ELSE
      CASE
        WHEN lastPiece = '' THEN CONCAT(firstPiece, '.', numbers)
        ELSE CONCAT(firstPiece, '.', numbers, '.', lastPiece)
      END
  END AS column_a,
  CASE
    WHEN lastPiece = '' THEN firstPiece
    ELSE CONCAT(firstPiece, '.', lastPiece)
  END AS column_b,
  numbers AS column_c
FROM(
   myHugeSubquery) tmp;


这是一个SQL Fiddle示例。

关于mysql - 使用正则表达式将字符与列中的数字分开,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31297706/

10-11 22:47
查看更多