我有一个带有列祖先的表格,其中包含格式化为"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