如何裁剪大括号之间的文本
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 ;
可能有更简洁的方法,但我现在想不出来。
显然,更好的解决方案是将当前序列化到该列中的数据规范化。
我在具有以下结构的一个字符串字段中有 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 ;
可能有更简洁的方法,但我现在想不出来。
显然,更好的解决方案是将当前序列化到该列中的数据规范化。