我在MySQL表中的一个名为query的varchar(4096)类型的列中有数千个字符串,它们看起来总是与下面的一个类似。括号并不总是相同的数字!这意味着在一个查询中,括号中可能有3个变量,而在另一个查询中,括号中可能有7个变量。
样本
“How can we compare the total rewards [team], taking into account that [industry] is better? Provide metrics for analysis, including [costs], and [best practices]. Additionally suggest any [potential areas for improvement] based on your analysis.”
我想做的是替换这些括号并将它们放在1应该计算现有括号数量的地方:
预期效果
“How can we compare the total rewards <span class="variable-1">[team]</span>, taking into account that <span class="variable-2">[industry]</span> is better? Provide metrics for analysis, including <span class="variable-3">[costs]</span>, and <span class="variable-4">[best practices]</span>. Additionally suggest any <span class="variable-5">[potential areas for improvement]</span> based on your analysis.”
我如何在MySQL中直接做到这一点?
2条答案
按热度按时间krugob8w1#
假设一个表foo有一个要修改的列bar和一个id主键:
fiddle
这将根据左括号的数量拆分每个字符串,并将span添加到以括号开头的每个部分,然后将它们重新连接在一起。
char_length...-char_length(replace...
是计算一个字符串中子字符串个数的方法。substring_index(substring_index(...,delim,i+1),delim,-1)
是如何提取由delim分隔的字符串的第i部分。jogvjijk2#
效率和有效性之间的一个折衷是将名称“variable”分配给所有变量,然后使用属于SQL层以上的工具收集所有变量。试图为每个变量分配不同的id可能会导致某种递归查询,这将显示出非常低效的情况(特别是当您处理数千个字符串时)。
假设使用相同的变量名也可以,可以尝试使用带有反向引用的
REGEXP_REPLACE
。为了确保匹配的文本不包含其他闭括号,我们可以使用惰性运算符?
。如果模式匹配由于'.* 而看起来过于宽松?',您可以将可用值限制在括号
[A-Za-z ]+?
中:或匹配除右括号
[^\\[]+
以外的任何字符:输出:
| txt|
| - -----|
| 我们如何比较总薪酬团队,考虑到行业更好?提供分析指标,包括成本和最佳实践。此外,根据您的分析提出任何潜在的改进领域。|
查看演示here。