Mysql 正则表达式在sql中创建新列的用法

Mysql 正则表达式在sql中创建新列的用法,mysql,regex,Mysql,Regex,我在SQL表中有一列,如下所示: Column_name 123.ten.abc.Testing 1245.eng.xyz.sleeping 现在,我想填充一个列,该列在上次出现点(.)之前提取列值,并填充到新列中。 所以我的新专栏应该如下所示 New_column 123.ten.abc 1245.eng.xyz 在SQL中使用正则表达式如何实现这一点?我认为没有正则表达式也可以做到: update your_table set new_column = SUBSTR(old_column

我在SQL表中有一列,如下所示:

Column_name
123.ten.abc.Testing
1245.eng.xyz.sleeping
现在,我想填充一个列,该列在上次出现点(.)之前提取列值,并填充到新列中。 所以我的新专栏应该如下所示

New_column
123.ten.abc
1245.eng.xyz

在SQL中使用正则表达式如何实现这一点?

我认为没有正则表达式也可以做到:

update your_table
set new_column = SUBSTR(old_column, 1,
                   LENGTH(old_column) - LOCATE('.', REVERSE(old_column)));
如果要将值作为新行插入,请使用:

Insert into your_table (new_column)
Select SUBSTR(old_column, 1,
                   LENGTH(old_column) - LOCATE('.', REVERSE(old_column)))
From your_table;
注意:接受的答案不正确


考虑文本为
1245.eng.xyz.sleeping.sleeping
时的情况。接受的答案将只返回
1245.eng.xyz
,而不是
1245.eng.xyz.sleeping

我认为您可以在不使用正则表达式的情况下执行此操作:

update your_table
set new_column = SUBSTR(old_column, 1,
                   LENGTH(old_column) - LOCATE('.', REVERSE(old_column)));
如果要将值作为新行插入,请使用:

Insert into your_table (new_column)
Select SUBSTR(old_column, 1,
                   LENGTH(old_column) - LOCATE('.', REVERSE(old_column)))
From your_table;
注意:接受的答案不正确


考虑文本为
1245.eng.xyz.sleeping.sleeping
时的情况。接受的答案将只返回
1245.eng.xyz
,而不是
1245.eng.xyz.sleeping
假设您的
表名为test,列名为
value
,我们可以这样做:

  • 获取最后一个
    后的子字符串:

    从测试中选择子字符串_索引(值',-1)

  • 现在,由于MySQL没有函数从另一个字符串中获取字符串的
    最后一次出现
    ,我们需要
    反转该字符串并获取第一次出现。所以,
    reverse
    我们从上一步得到的结果,得到长度

    从测试中选择长度(反向(子字符串_索引(值“,”,-1))

  • 完成此操作后,我们可以反转整个字符串,从长度中获取子字符串(在上一步中找到),这将修剪该单词的最后一次出现,并再次反转它:

    从测试中选择反转(SUBSTR(反转(值)、长度(反转(SUBSTRING_索引(值“,”,-1)))+2)

这将为您提供所需的输出。这是

获得此值后,可以执行
INSERT-in。。选择
语句以插入值,例如:

INSERT INTO TABLE2 (new_value) 
SELECT REVERSE(SUBSTR(REVERSE(value), LENGTH(REVERSE(SUBSTRING_INDEX(value, '.', -1)))+2)) from test;
更新


更新答案以涵盖@GurV指出的边缘情况。

假设您的
表名为test,列名为
value,我们可以这样做:

  • 获取最后一个
    后的子字符串:

    从测试中选择子字符串_索引(值',-1)

  • 现在,由于MySQL没有函数从另一个字符串中获取字符串的
    最后一次出现
    ,我们需要
    反转该字符串并获取第一次出现。所以,
    reverse
    我们从上一步得到的结果,得到长度

    从测试中选择长度(反向(子字符串_索引(值“,”,-1))

  • 完成此操作后,我们可以反转整个字符串,从长度中获取子字符串(在上一步中找到),这将修剪该单词的最后一次出现,并再次反转它:

    从测试中选择反转(SUBSTR(反转(值)、长度(反转(SUBSTRING_索引(值“,”,-1)))+2)

这将为您提供所需的输出。这是

获得此值后,可以执行
INSERT-in。。选择
语句以插入值,例如:

INSERT INTO TABLE2 (new_value) 
SELECT REVERSE(SUBSTR(REVERSE(value), LENGTH(REVERSE(SUBSTRING_INDEX(value, '.', -1)))+2)) from test;
更新


答案已更新,以涵盖@GurV指出的边缘情况。

如果找到的子字符串出现两次或更多次,该怎么办?它不起作用。如果您找到的子字符串出现两次或更多次怎么办?这行不通。