0

我有一个表格,其中有一列祖先,其中包含一个祖先列表,格式如下“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 的那个

怎么了?

谢谢!

4

3 回答 3

2

这听起来像是一份工作LIKE,而不是IN

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

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

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

于 2012-04-10T07:17:18.837 回答
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
于 2012-04-10T07:21:46.853 回答
0

在 MySQL 中,您可以编写:

SELECT * FROM nodes
WHERE ancestry = '1' 
   OR LEFT(ancestry, 2) = '1/'
   OR RIGHT(ancestry, 2) = '/1'
   OR INSTR(ancestry, '/1/') > 0
于 2012-04-10T07:17:03.237 回答