我有一个 MySQL 函数“GetChildren(id)”,它返回一个以逗号分隔的 id 列表,这些 id 是传递给该函数的 id 的子级。
我想按如下方式使用该函数的输出:
SELECT * FROM table WHERE id IN (GetChildren(36))
如果 id 36 有子 ID 37,38 和 39,那么我会取回这三行。
然而,发生的情况是我只获得了第一个 id。
SQL fiddle 似乎在函数方面存在困难,但这里有一个简化的示例来演示该问题:
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 一样?
最佳答案
我认为 MySQL 需要支持表值函数才能以这种方式使用它。否则,IN 的行为符合预期,someInt IN (astring)
将 IN 列表成员转换为整数,在您的情况下评估为 ID IN (2)
但是,您可以使用 FIND_IN_SET以与您正在尝试的方式类似的方式。
类似FIND_IN_SET(ID, GetChildren(36)) > 0
关于MySQL : Using a function output with IN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52412005/