认为这是一个常见问题,但在扫描过去一小时的采访后,显然没有。
简而言之,我试图将一个用于过程的常见查询。这是我到目前为止所拥有的。
DROP PROCEDURE IF EXISTS splitColumnsDelimiter;
CREATE PROCEDURE splitColumnsDelimiter(IN DELIMITER VARCHAR(5))
BEGIN
SELECT
sometbl.id,
SUBSTRING_INDEX(SUBSTRING_INDEX(sometbl.name, '|', numbers.n), '|', -1) name
FROM
(SELECT 1 n UNION ALL SELECT 2
UNION ALL SELECT 3 UNION ALL SELECT 4) numbers INNER JOIN sometbl
ON CHAR_LENGTH(sometbl.name)
-CHAR_LENGTH(REPLACE(sometbl.name, '|', ''))>=numbers.n-1
ORDER BY
id, n
END;
查询本身就像一个魅力。然而,似乎添加任何代码将其转换为程序会使我在工作台上使用弹出错误。从我在互联网上找到的例子来看,我应该(?)是好的,但显然不是,所以任何人都碰巧知道我可能被误入歧途,哪里可以开悟?这一点非常容易。
编辑:以下代码似乎至少消除了错误的发生。
DROP PROCEDURE IF EXISTS splitColumnsDelimiter;
DELIMITER //
CREATE PROCEDURE splitColumnsDelimiter()
BEGIN
SELECT
sometbl.id,
SUBSTRING_INDEX(SUBSTRING_INDEX(sometbl.name, '|', numbers.n), '|', -1) name
FROM
(SELECT 1 n UNION ALL SELECT 2
UNION ALL SELECT 3 UNION ALL SELECT 4) numbers INNER JOIN sometbl
ON CHAR_LENGTH(sometbl.name)
-CHAR_LENGTH(REPLACE(sometbl.name, '|', ''))>=numbers.n-1
ORDER BY
id, n;
END //
DELIMITER ;
执行CALL splitColumnsDelimiter;现在按预期工作,返回我希望看到的SQL表返回。
答案 0 :(得分:1)
尝试一下:
DELIMITER //
DROP PROCEDURE IF EXISTS splitColumnsDelimiter;
CREATE PROCEDURE splitColumnsDelimiter()
BEGIN
SELECT
sometbl.id,
SUBSTRING_INDEX(SUBSTRING_INDEX(sometbl.name, '|', numbers.n), '|', -1) name
FROM
(SELECT 1 n UNION ALL SELECT 2
UNION ALL SELECT 3 UNION ALL SELECT 4) numbers INNER JOIN sometbl
ON CHAR_LENGTH(sometbl.name)
-CHAR_LENGTH(REPLACE(sometbl.name, '|', ''))>=numbers.n-1
ORDER BY
id, n;
END //
DELIMITER ;
如果您打算为分隔符|
添加一个参数,然后输入一个参数并使用它而不是硬编码,则不应将其称为DELIMITER
编辑:
我在你的comments that you are using workbench中读到,只需按照以下步骤定义:
CREATE PROCEDURE splitColumnsDelimiter()
BEGIN
SELECT
sometbl.id,
SUBSTRING_INDEX(SUBSTRING_INDEX(sometbl.name, '|', numbers.n), '|', -1) name
FROM
(SELECT 1 n UNION ALL SELECT 2
UNION ALL SELECT 3 UNION ALL SELECT 4) numbers INNER JOIN sometbl
ON CHAR_LENGTH(sometbl.name)
-CHAR_LENGTH(REPLACE(sometbl.name, '|', ''))>=numbers.n-1
ORDER BY
id, n;
END
删除DELIMITER
和DROP
声明