我在 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 代碼也可能是動態的。
我想知道是否可以通過 SQL 查詢在兩個大括號之間提取文本值?
uj5u.com熱心網友回復:
這真的很可怕,但它適用于您的簡單示例-
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 az 字符 - [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 ;
可能有一種更清潔的方法,但我現在想不出。
顯然,更好的解決方案是對當前序列化到此列中的資料進行規范化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/372050.html
下一篇:串列中元素之間的字串比較
