|
|
飘逸的饭卡 · Northwestern ...· 3 月前 · |
|
|
冷冷的鸭蛋 · 《眷思量》第二季“女主角屠丽”全新服装曝光新 ...· 11 月前 · |
|
|
小眼睛的机器猫 · 深圳经济特区处理历史遗留生产经营性违法建筑若 ...· 1 年前 · |
|
|
慈祥的砖头 · 高原山地气候,星球造型师_手机搜狐网· 1 年前 · |
|
|
伤情的脸盆 · 玄武体校在第二十届省运会花样游泳赛事中屡夺金 ...· 1 年前 · |
我希望有一个这样的mysql查询:
select <second word in text> word, count(*) from table group by word;
mysql中的所有正则表达式示例都用于查询文本是否与表达式匹配,而不是用于从表达式中提取文本。有这样的语法吗?
不,没有使用正则表达式提取文本的语法。你必须使用普通的 string manipulation functions 。
或者,从数据库中选择整个值(如果担心数据传输太多,则选择前n个字符),然后在客户机上使用正则表达式。
根据 http://dev.mysql.com/ 的说法,SUBSTRING函数使用起始位置,然后是长度,所以第二个单词的函数肯定是:
SUBSTRING(sentence,LOCATE(' ',sentence),(LOCATE(' ',LOCATE(' ',sentence))-LOCATE(' ',sentence)))
以下是针对OP的特定问题(提取字符串的第二个单词)提出的解决方案,但需要注意的是,正如mc0e的答案所述,在MySQL中不支持实际提取正则表达式匹配。如果你真的需要它,那么你的选择基本上是1)在客户机上进行后处理,或者2)安装一个MySQL扩展来支持它。
BenWells几乎是正确的。根据他的代码,下面是一个略微调整的版本:
SUBSTRING(
sentence,
LOCATE(' ', sentence) + CHAR_LENGTH(' '),
LOCATE(' ', sentence,
( LOCATE(' ', sentence) + 1 ) - ( LOCATE(' ', sentence) + CHAR_LENGTH(' ') )
)
作为一个工作示例,我使用:
SELECT SUBSTRING(
sentence,
LOCATE(' ', sentence) + CHAR_LENGTH(' '),
LOCATE(' ', sentence,
( LOCATE(' ', sentence) + 1 ) - ( LOCATE(' ', sentence) + CHAR_LENGTH(' ') )
) as string
FROM (SELECT 'THIS IS A TEST' AS sentence) temp
这成功地提取了单词
IS
提取句子中第二个单词的Shorter选项:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('THIS IS A TEST', ' ', 2), ' ', -1) as FoundText
正如其他人所说,mysql不提供用于提取子字符串的正则表达式工具。但这并不是说,如果您准备使用用户定义函数扩展mysql,就不能使用它们:
https://github.com/mysqludf/lib_mysqludf_preg
如果您想分发软件,这可能没有太大帮助,因为这是安装软件的障碍,但对于内部解决方案来说,它可能是合适的。
我使用Brendan Bullen的答案作为我遇到的类似问题的起点,即检索JSON字符串中特定字段的值。然而,正如我在他的回答中所评论的那样,这并不完全准确。如果你的左边界不是像原始问题中那样只是一个空间,那么差异就会增加。
更正的解决方案:
SUBSTRING(
sentence,
LOCATE(' ', sentence) + 1,
LOCATE(' ', sentence, (LOCATE(' ', sentence) + 1)) - LOCATE(' ', sentence) - 1
)
两个差异是SUBSTRING index参数中的+1和length参数中的-1。
有关“在两个提供的边界之间查找字符串的第一个匹配项”的更一般解决方案:
SUBSTRING(
haystack,
LOCATE('<leftBoundary>', haystack) + CHAR_LENGTH('<leftBoundary>'),
LOCATE(