一些外部数据供应商想给我一个数据字段 - 管道分隔的字符串值,我觉得这很难处理。
如果没有应用程序编程语言的帮助,有没有办法将字符串值转换为行?
但是有一个困难,该字段具有未知数量的定界元素。
有问题的数据库引擎是 MySQL。
例如:
Input: Tuple(1, "a|b|c")
Output:
Tuple(1, "a")
Tuple(1, "b")
Tuple(1, "c")
可能没有我最初想的那么难。
这是一种通用方法:
length(val) - length(replace(val, '|', ''))
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)
你需要一个循环来解决你的问题。
尽管您的问题可能已经解决了很长时间,但我一直在寻找解决您遇到的同样问题的方法。我在此处引用的过程的帮助下解决了这个问题,通过使用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 ;