sql in子句不起作用

时间:2012-04-10 07:13:04

标签: sql in-clause

我有一个带有列祖先的表,其中包含一个格式为“1/12/45”的祖先列表。 1是根,12是1的孩子等...

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

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

我得到以下错误声明:运算符不存在:integer = text

我也尝试了这个:

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

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

的人

怎么了?

谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

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

请注意,字符串连接的确切语法因SQL产品而异。请注意,我正在添加并附加到ancestry列,以便我们不必以不同于中间项的方式处理列表中的第一个/最后一个项目。另请注意,我们将1/包围在一起,这样我们就不会获得错误匹配,例如使用/51//12/

答案 1 :(得分:0)

在MySQL中你可以写:

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

答案 2 :(得分:0)

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

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

或:

... in (select id from SomeOtherTable)

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

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

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