我试图弄清楚如何对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/