我有一个带有列祖先的表,其中包含一个格式为“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
的人怎么了?
谢谢!
答案 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