如何在MySQL中用标签替换括号中的字符串< span>

sd2nnvve  于 12个月前  发布在  Mysql
关注(0)|答案(2)|浏览(352)

我在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中直接做到这一点?

krugob8w

krugob8w1#

假设一个表foo有一个要修改的列bar和一个id主键:

update foo
join (
    select id, group_concat(case when i then concat('<span class="variable-',i,'">[',replace(substring_index(substring_index(bar,'[',i+1),'[',-1),']',']</span>')) else substring_index(bar,'[',1) end order by i separator '') newbar
    from foo
    join (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 10) i
        on i <= char_length(bar)-char_length(replace(bar,'[',''))
    group by id
) newbar using (id)
set bar=newbar

fiddle
这将根据左括号的数量拆分每个字符串,并将span添加到以括号开头的每个部分,然后将它们重新连接在一起。
char_length...-char_length(replace...是计算一个字符串中子字符串个数的方法。
substring_index(substring_index(...,delim,i+1),delim,-1)是如何提取由delim分隔的字符串的第i部分。

jogvjijk

jogvjijk2#

效率和有效性之间的一个折衷是将名称“variable”分配给所有变量,然后使用属于SQL层以上的工具收集所有变量。试图为每个变量分配不同的id可能会导致某种递归查询,这将显示出非常低效的情况(特别是当您处理数千个字符串时)。
假设使用相同的变量名也可以,可以尝试使用带有反向引用的REGEXP_REPLACE。为了确保匹配的文本不包含其他闭括号,我们可以使用惰性运算符?

SELECT REGEXP_REPLACE(txt, 
                      '\\[(.*?)\\]',
                      '<span class="variable">$1</span>') AS txt
FROM tab

如果模式匹配由于'.* 而看起来过于宽松?',您可以将可用值限制在括号[A-Za-z ]+?中:

SELECT REGEXP_REPLACE(txt, 
                      '\\[([A-Za-z ]+?)\\]', 
                      '<span class="variable">$1</span>') AS txt
FROM tab;

或匹配除右括号[^\\[]+以外的任何字符:

SELECT REGEXP_REPLACE(txt, 
                      '\\[([^\\[]+)\\]', 
                      '<span class="variable">$1</span>') AS txt
FROM tab;

输出

| txt|
| - -----|
| 我们如何比较总薪酬团队,考虑到行业更好?提供分析指标,包括成本和最佳实践。此外,根据您的分析提出任何潜在的改进领域。|
查看演示here

相关问题