如何裁剪大括号之间的文本

How to crop text between braces

我在具有以下结构的一个字符串字段中有 MySQL 中的数据:

{language *lang_code*}text{language}{language *lang_code*}text{language}

这里是例子:

{language en}text in english{language}{language de}text in german{language}

这种情况下的理想输出是

text in english

所以我们想忽略其他语言,只想提取第一个,并将其放入新的列中,因为它通常是产品的标题,带有翻译,对我们来说第一个是最多的重要。

第一个大括号中的值可能不同,例如这里的第一个是英语,但在其他示例中可能是德语,因此 lang code 也可能充满活力。

我想知道是否可以通过 SQL 查询提取两个第一个大括号之间的文本值?

这真的很糟糕,但它适用于您的简单示例 -

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(REGEXP_SUBSTR('{language en}text in english{language}{language de}text in german{language}', '\{language en\}(.*?)\{language\}'), '}', -2), '{', 1);

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(REGEXP_SUBSTR('{language en}text in english{language}{language de}text in german{language}', '\{language de\}(.*?)\{language\}'), '}', -2), '{', 1);

检索德语文本。

无论语言如何,要检索字符串中的第一个文本,您可以使用 -

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(REGEXP_SUBSTR('{language en}text in english{language}{language de}text in german{language}', '\{language [a-z]{2}\}(.*?)\{language\}'), '}', -2), '{', 1);

请注意,此版本假定语言代码始终为 2 x a-z 字符 - [a-z]{2}

下面是一个包装在存储函数中的上述示例 -

DELIMITER $$

CREATE FUNCTION `ExtractLangString`(content TEXT, lang CHAR(8))
RETURNS text
DETERMINISTIC
BEGIN
    -- if lang is not 2 chars in length or lang not found return first language string
    IF LENGTH(lang) <> 2 OR content NOT LIKE CONCAT('%{language ', lang, '}%') THEN
        SET lang = '[a-z]{2}';
    END IF;
    RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(REGEXP_SUBSTR(content, CONCAT('\{language ', lang, '\}(.*?)\{language\}')), '}', -2), '{', 1);
END$$

DELIMITER ;

可能有更简洁的方法,但我现在想不出来。

显然,更好的解决方案是将当前序列化到该列中的数据规范化。