一些外部数据供应商希望给我一个数据字段 - 管道分隔的字符串值,我觉得很难处理。
如果没有应用程序编程语言的帮助,有没有办法将字符串值转换为行?
然而,存在一个困难,该字段具有未知数量的分隔元素。
有问题的数据库引擎是MySQL。
例如:
Input: Tuple(1, "a|b|c")
Output:
Tuple(1, "a")
Tuple(1, "b")
Tuple(1, "c")
答案 0 :(得分:3)
这可能不像我最初想的那么困难。
这是一般方法:
length(val) - length(replace(val, '|', ''))
答案 1 :(得分:3)
Federico Cargnelutti使用此功能:
CREATE FUNCTION SPLIT_STR(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '');
用法
SELECT SPLIT_STR(string, delimiter, position)
你需要一个循环来解决你的问题。
答案 2 :(得分:0)
虽然你的问题可能已经很久了,但我一直在寻找解决你遇到的同样问题的方法。我在procedure referenced here的帮助下解决了这个问题,稍微适应了使用CHAR_LENGTH()
代替LENGTH()
来提供字符串中的多字节字符(例如德语元音)。
DELIMITER $$
CREATE FUNCTION SPLIT_STRING(val TEXT, delim VARCHAR(12), pos INT) RETURNS TEXT
BEGIN
DECLARE output TEXT;
SET output = REPLACE(SUBSTRING(SUBSTRING_INDEX(val, delim, pos), CHAR_LENGTH(SUBSTRING_INDEX(val, delim, pos - 1)) + 1), delim, '');
IF output = '' THEN
SET output = null;
END IF;
RETURN output;
END $$
CREATE PROCEDURE TRANSFER_CELL()
BEGIN
DECLARE i INTEGER;
SET i = 1;
REPEAT
INSERT INTO NewTuple (id, value)
SELECT id, SPLIT_STRING(value, '|', i)
FROM Tuple
WHERE SPLIT_STRING(value, '|', i) IS NOT NULL;
SET i = i + 1;
UNTIL ROW_COUNT() = 0
END REPEAT;
END $$
DELIMITER ;
CALL TRANSFER_CELL() ;
DROP FUNCTION SPLIT_STRING ;
DROP PROCEDURE TRANSFER_CELL ;