的问题是,你已经使用的子查询
SELECT DISTINCT
group_concat(replace(StringIds,'|',','))
FROM Ids
实际上重新如预期的那样变成字符串'1,2,3,...'
不是数字列表1,2,3,...
。
WHERE StringId IN ((SELECT...))
将无法使用字符串,它需要一个元素列表和字符串是一个元素。
所以相反,你将不得不看看字符串函数,在那里你可以使用INSTR(X,Y)函数来查找StringId。
但是在这里我们必须注意,因为如果i.E.我们到哪里寻找 数量3
那么我们会发现它在:
1,2,3,4
,但它也将发现它在
1,2,30,4
因此,关键是要环绕的查询字符串分隔 和搜索字符串。因此,如果我们要搜索',3,'
,',1,2,3,4,'
,我们会按预期匹配,如果我们搜索',1,2,30,4,'
,那么我们将不匹配,这也是预期的。因此,这是我们在我们的查询:)
SELECT group_concat(StringName || '\n') as AllNames
FROM Names
WHERE INSTR(
(',' || (
SELECT DISTINCT
group_concat(replace(StringIds,'|',','))
FROM Ids
) || ','),
(',' || StringId || ',')
) > 0
ORDER BY StringName ASC;
那么这些奇怪的concats现在,如果我们考虑一下它的原因,因为我们是在一个字符串搜索, 我们不妨用你的oringinal字符串,而不是提前将它的 :
SELECT group_concat(StringName || '\n') as AllNames
FROM Names
WHERE INSTR(
('|' || (
SELECT StringIds FROM Ids LIMIT 1
) || '|'),
('|' || StringId || '|')
) > 0
ORDER BY StringName ASC;
而实际上还有很多方面,我们可以做到这一点。让我给你使用LIKE
比较,而不是INSTR
功能的最后一个版本:
SELECT group_concat(StringName || '\n') as AllNames
FROM Names
WHERE
('|' || (
SELECT StringIds FROM Ids LIMIT 1
) || '|')
LIKE
('%|' || StringId || '|%')
ORDER BY StringName ASC;
希望此链接,这样你就可以Fiddle around here
UPDATE
如果你最终不得不在多个条目您的ID表,并且您想要打印出Ids表中每个条目的唯一名称,那么您必须扭转查询:
SELECT
(SELECT group_concat(StringName || '\n')
FROM Names
WHERE
('|' || (
StringIds
) || '|')
LIKE
('%|' || StringId || '|%')
ORDER BY StringName ASC
) as AllNames FROM Ids
现在这里Ids是循环的外部表,并且对于每个条目执行子查询,该查询返回AllNames值。
谢谢..最后一个选项是否会工作,即使它是几行stringname的引用相同的字符串? – Henrik
@Henrik不用担心,即使您在StringIds中有三次15次,理论上它也会匹配15次,但是您从名称中选择,因此它将检查StringId是否为StringId,因此不会选择重复项 –
@Henrik如果这对你有帮助,请将问题标记为已回答! –