我有一个带有REGEXP的mysql查询,该查询匹配字段的开头与' A',' An'和''如果匹配则跟随空格然后从第一个空格的开始修剪字段,然后我匹配具有特殊字符的字段的开头(如#39;,'',[:space:])如果是,则修剪所有领先的特殊字符。 Mysql查询与CASE
一样:
CASE
WHEN field_data_field_display_title_field_display_title_value REGEXP '(^(A|An|The)[[:space:]])' = 1 THEN
TRIM(SUBSTR(field_data_field_display_title_field_display_title_value , INSTR(field_data_field_display_title_field_display_title_value ,' ')))
WHEN field_data_field_display_title_field_display_title_value REGEXP '(^[\"\'[:space:]])' = 1 THEN
TRIM(SUBSTR(field_data_field_display_title_field_display_title_value ,2))
ELSE field_data_field_display_title_field_display_title_value
END
我无法修剪所有领先的特殊角色,而我可以通过传递' 2'来修剪第一个领先的特殊角色。在SUBSTR
函数中。由于mysql不支持捕获组,因此我无法获取捕获组中的匹配值。
所以我的问题是如何在mysql查询字段中获得第一个字母字符的位置,以便我可以在SUBSTR
函数中传递该位置以修剪所有前导特殊字符。我尝试使用[:alpha:]类,如:
TRIM(SUBSTR(field_data_field_display_title_field_display_title_value ,
INSTR(field_data_field_display_title_field_display_title_value ,[:alpha:])))
但它给出了mysql语法错误。或者任何人都可以建议我修剪所有主要特殊字符的任何其他方法。
提前致谢!
答案 0 :(得分:0)
没有regexp匹配函数报告字符串中的位置,MySQL中也没有任何regexp替换函数。
如果您知道自己正在搜索特定单词的简短列表,那么您可以在几个匹配中找到最少的位置:
SUBSTRING(field_data_field_display_title_field_display_title_value,
LEAST(
INSTR(field_data_field_display_title_field_display_title_value, 'A '),
INSTR(field_data_field_display_title_field_display_title_value, 'An '),
INSTR(field_data_field_display_title_field_display_title_value, 'The ')
)
)
在SQL中进行子字符串匹配或替换通常很不方便,因为SQL基本上是将列视为不可简化的数据。使用子字符串的任何函数都是语言的扩展,而不是内置的函数。
如果您希望通过字符串函数更好地处理,那么将整个字符串提取到应用程序中更容易,并使用更丰富的函数集编写代码。虽然我理解如果您描述的子字符串操作的原因是针对影响查询结果的表达式,例如限制行的WHERE子句,或者在ORDER BY子句中进行排序,这是不切实际的。
如果是这样,那么更好的解决方案是改变存储字符串的方式。将前缀部分中的字符串拆分为特殊字符,然后将单独的列拆分为以A,An或The开头的部分,然后甚至是第三列,其中包含您不希望成为其中一部分的尾随文本正文。
将它拆分的好处是,处理主字符串的SQL表达式要简单得多,你甚至可以正常索引它以获得某些查询的大量性能。
答案 1 :(得分:0)
我正在使用我在ORDER BY子句中发布的mysql片段对数据进行排序。因为我有一小部分我想要删除的比赛,所以我遵循了@BillKarwin的建议。 查询中的ORDER BY子句变为类似
ORDER BY
CASE
WHEN field_data_field_display_title_field_display_title_value REGEXP '^(A|An|The)[[:space:]]' = 1 THEN
TRIM(SUBSTR(field_data_field_display_title_field_display_title_value , INSTR(field_data_field_display_title_field_display_title_value ,' ')))
WHEN field_data_field_display_title_field_display_title_value REGEXP '^[\']' = 1 THEN
TRIM(LEADING '\'' FROM field_data_field_display_title_field_display_title_value)
WHEN field_data_field_display_title_field_display_title_value REGEXP '^[[:space:]]' = 1 THEN
TRIM(LEADING ' ' FROM field_data_field_display_title_field_display_title_value)
WHEN field_data_field_display_title_field_display_title_value REGEXP '^[\"]' = 1 THEN
TRIM(LEADING '"' FROM field_data_field_display_title_field_display_title_value)
ELSE field_data_field_display_title_field_display_title_value
END ASC