0

可能重复:
如何使用 SQL 从字符串末尾删除数字

如果我有一个Songs如下所示的 sqlite 表:

id  SongName    
------------------
0   midnight   
1   Another song  
2   01 midnight01  
3   01 01 midnight
4   Another record
5   1 midnight

使用 select 或 update 和 REGEX 表达式,会返回什么?:

id  SongName    
------------------
0   midnight   
1   Another song  
2   midnight01  
3   midnight
4   another record
5   midnight

我用过

从 SongName REGEXP '\b^[0-9]\b' 的歌曲中选择 SongName

或者

从 SongName REGEXP '\d' 的歌曲中选择 SongName

但仍然没有得到我想要的结果。

4

2 回答 2

1

对不起,我对C接口不熟悉。但是,如果您在仅找到合适的正则表达式时遇到问题,这可能会奏效。

(\d+\s)+(.*)

它匹配随机数量的数字-空格组合,如果您使用$2or返回第二个捕获组\2,您最终会得到歌曲标题。

注意:这需要在您要删除的数字和实际歌曲标题之间留一个空格。它匹配“01 01 some text”和“11 some text”就好了(第二个捕获组返回“some text”)。但是,如果您匹配“01 01some text”,您最终会得到“01some text”(仅删除空格之前的数字)。

更新。这可能会奏效。它只选择歌曲标题。与上述相同的注释适用。

[^\d+\s]+.*
于 2012-04-11T21:16:31.790 回答
0

从文档中引用:

REGEXP 运算符是 regexp() 用户函数的特殊语法。默认情况下没有定义 regexp() 用户函数,因此使用 REGEXP 运算符通常会导致错误消息。如果在运行时添加了名为“regexp”的应用程序定义的 SQL 函数,则将调用该函数以实现 REGEXP 运算符。

MATCH 运算符是 match() 应用程序定义函数的特殊语法。默认的 match() 函数实现会引发异常,并且对任何事情都没有真正的用处。但是扩展可以用更有用的逻辑覆盖 match() 函数。

因此,换句话说,您将不得不使用 C 接口来覆盖这些运算符中的一个或两个

老实说,解决此问题的最佳方法是重组数据。歌曲名称的数字部分要么是无用的(在这种情况下,它们一开始就不应该在那里),要么没有(在这种情况下,它们需要在自己的列中)。

于 2012-04-11T18:51:40.610 回答