【问题标题】:working principle of IN operator in sqlsql中IN运算符的工作原理
【发布时间】:2018-06-11 07:50:47
【问题描述】:

我有一个 varchar 列,例如 'a,b,c,d,cd,cx,bx'。这有用于分隔一些前缀代码的逗号,我想在此列中搜索 c 前缀。列名是前缀。

当我们使用 IN 运算符时:

select * from prefixes where 'c' IN (prefix)

它确实有效,但如何?我知道前缀必须是 'a'、'b'、'c'、'd'、'cd'、'cx'、'bx' 才能用于 IN 运算符,例如:

select * from prefixes where 'c' IN ('a', 'b', 'c', 'd', 'cd', 'cx', 'bx')

我错了吗?它是如何工作的?逗号不是分隔符。那些是像前缀这样的字符串。

【问题讨论】:

  • 您使用的是哪个版本的 SQL?
  • 火鸟 2.5。我在 ibexpert 中测试过
  • 永远不要将数据存储为逗号分隔的项目。只会给你带来很多麻烦。
  • @jarlh 我同意你的观点,我认为这个查询不应该正常工作,但它可以工作。怎么样?

标签: sql operators firebird sql-in


【解决方案1】:

这是一个通用的查询:

SELECT *
FROM yourTable
WHERE ',' || col || ',' LIKE '%,c,%';

这里的技巧是在稍微修改的列值,a,b,c,d,cd,cx,bx, 中搜索,c,。我们在列 CSV 值的开头和结尾添加逗号,以便可以使用逗号分隔符对每个术语进行唯一处理。

虽然这为您提供了一种解决方法,但您应该将其视为临时的。最好的长期解决方案是在您的表格中存储 CSV。

【讨论】:

  • 我知道,但我想了解它如何处理相关查询?怎么样?
  • @Hanik 我已经尽我所能回答了你的问题。你应该花一些时间去理解它。
  • 非常感谢,但我不想要任何有效的查询。我想了解“select * from prefixes where 'c' IN (prefix)”查询如何工作?如何 ?前缀有一个字符串有一些逗号
  • @Hanik 我的查询可能与您得到的一样好。不要在表格中存储 CSV。
【解决方案2】:

下面的查询工作方式相同

SELECT *
FROM some_table
WHERE 'a' = 'a'

或另一个例子:1 = 1, 1

查询将遍历表中的所有记录,并且当它检查条件 (WHERE) 时,它始终为真。它将返回表中的所有数据,因为您的静态条件始终为真。

【讨论】:

    猜你喜欢
    • 2011-04-18
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 2015-08-04
    • 2015-09-27
    相关资源
    最近更新 更多