我有一个MySQL函数“ GetChildren(id)”,该函数返回以逗号分隔的ID列表,这些ID是传递给该函数的ID的子代。
我想使用该函数的输出,如下所示:
SELECT * FROM table WHERE id IN (GetChildren(36))
如果id 36有孩子id 37,38和39,那么我会把那三行取回来。
但是,发生的是我只得到第一个ID。
SQL提琴在功能上似乎有困难,但这是一个演示问题的简化示例:
CREATE TABLE test (
`ID` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO test (ID) VALUES (1),(2),(3),(4);
DELIMITER $$
DROP FUNCTION IF EXISTS `TestFN` $$
CREATE FUNCTION `TestFN` (GivenID VARCHAR(1024)) RETURNS varchar(1024) CHARSET latin1
DETERMINISTIC
BEGIN
RETURN '2,3,4';
END $$
DELIMITER ;
设置后,如果我运行SELECT TestFN(1)
,则会按预期返回2,3,4
。
如果我运行SELECT ID FROM test WHERE ID IN (TestFN1)
,我只会返回ID为2的一行。SELECT ID FROM test WHERE ID = (TestFN1)
也会发生同样的情况
有没有办法像我在ID IN (...)
子句中键入ID一样使用此函数的输出?
答案 0 :(得分:2)
我认为MySQL需要支持表值函数,以便您以这种方式使用其中之一。否则,IN会按预期方式运行,someInt IN (astring)
将IN列表成员强制转换为int,并根据您的情况评估为ID IN (2)
但是,您可能会以与尝试使用的方式类似的方式使用FIND_IN_SET。
类似FIND_IN_SET(ID, GetChildren(36)) > 0