【问题标题】:sql in clause doesn't worksql in 子句不起作用
【发布时间】:2012-04-10 07:13:03
【问题描述】:

我有一个表格,其中有一列祖先,其中包含一个祖先列表,其格式类似于“45 年 1 月 12 日”。 1 是根,12 是 1 的孩子,等等......

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

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

我收到以下错误声明:运算符不存在:整数 = 文本

我也试过这个:

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

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

怎么了?

谢谢!

【问题讨论】:

  • 是什么让您认为in 是完成这项工作的正确工具?或者它会神奇地知道如何解释您的ancestry 列?
  • 如果您有可能重新设计您的表格,您应该这样做。不建议将结构化信息保存在这样的字符串中,只会让您陷入各种问题。

标签: sql in-clause


【解决方案1】:

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

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

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

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

【讨论】:

  • 如果他还需要匹配1/,他可能需要一些正则表达式匹配。
  • 嗨 Damien,您的解决方案是我一直使用的解决方案,但我想要更清洁的东西。 IN 对我来说似乎很明显,但显然不是那么明显......
  • 为了完整性:在 Postgres 中,这变成: select * from nodes where '/' ||节点.祖先 || '/' 像 '%/1/%'
【解决方案2】:

在 MySQL 中你可以这样写:

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

【讨论】:

    【解决方案3】:

    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
    

    【讨论】:

    • 我也试过这个:select * from nodes where '1' in (replace(nodes.ancestry,'/',',')) 但我得到了相同的结果
    • @ndemoreau:您不能使用in 运算符在另一个字符串中查找字符串。如果要使用in 运算符,则必须将字符串'1/12/45' 拆分为临时表中的三个记录,这将是一个非常缓慢的解决方案。
    • 我明白,但为什么我不能使用 IN 运算符在逗号分隔列表中查找整数。这应该工作!?不应该吗?
    • @ndemoreau - 你神话般的in 运算符对包含逗号的 single 字符串的神奇处理如何处理字符串可以合法包含逗号的可能性,并且(因为代码生成)IN 列表可以合法地包含单个项目?它不会对字符串进行深入检查并说“你知道吗,我可以在这个字符串中看到逗号,我会神奇地将它分开并将其视为单独的参数”。
    • @ndemoreau:不,它不应该工作。字符串不是逗号分隔列表,即使字符串包含可以解释为逗号分隔列表的字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2018-04-23
    • 2013-01-26
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    相关资源
    最近更新 更多