sql in 子句不起作用



我有一个带有列祖先的表格,其中包含格式化为"1/12/45"的祖先列表。 1 是根,12 是 1 的子项,依此类推...

我需要在其祖先列表中找到所有具有特定节点/编号的记录。为此,我写了这个sql语句:

select * from nodes where 1 in (nodes.ancestry)

我得到以下错误消息:运算符不存在:整数=文本

我也试过这个:

select * from nodes where '1' in (nodes.ancestry)

但它只返回在其祖先字段中有 1 的记录。不是例如 1/12/45 的那个

怎么了?

谢谢!

听起来像是LIKE的工作,而不是IN

如果我们假设您想在任何位置搜索此值,那么我们可能会尝试:

 select * from nodes where '/' + nodes.ancestry + '/' like '%/1/%'

请注意,字符串串联的确切语法因 SQL 产品而异。请注意,我在ancestry列前面加上并附加了它,这样我们就不必将列表中的第一个/最后一个项目与中间项目区别对待。另请注意,我们用 / s 包围1,这样我们就不会得到错误的匹配,例如与 /51//12/

在MySQL中,你可以写:

SELECT * FROM nodes
WHERE ancestry = '1' 
   OR LEFT(ancestry, 2) = '1/'
   OR RIGHT(ancestry, 2) = '/1'
   OR INSTR(ancestry, '/1/') > 0

in运算符需要一个逗号分隔的值列表或查询结果,即:

... in (1,2,3,4,5)

或:

... in (select id from SomeOtherTable)

您需要做的是从数字创建一个字符串,以便您可以在另一个字符串中查找它。

仅在祖先列表中查找字符串'1'会给出误报,因为它会在字符串'2/12/45'中找到它。您需要将分隔符添加到两个字符串的开头和结尾,以便在类似 '/1/12/45/' 的字符串中查找类似 '/1/' 的字符串:

select * from nodes
where charindex('/' + convert(varchar(50), 1) + '/', '/' + nodes.ancestry + '/') <> 0

相关内容

  • 没有找到相关文章

最新更新