【问题标题】:Select statement with multiple 'where' fields using same value without duplicating text选择具有多个“where”字段的语句,使用相同的值而不复制文本
【发布时间】:2010-03-11 20:37:28
【问题描述】:

首先我会说我不认为我想要的东西可以做到,但我希望我错了,有人比我知道的更多。所以这是你的机会......证明你比我聪明:)

我想对 SQLite 表进行搜索,以查找任何“相似”的记录,而不必长时间写出查询。

为了澄清这是我知道我可以编写查询的方式:

select * from Articles where title like '%Bla%' or category like '%Bla%' or post like '%Bla%'

如果您只检查几列,这很有效,而且不是什么大问题,但是如果您需要检查一堆,那么您的查询可能会变得非常长而且看起来非常快,更不用说机会了错别字。 (即:'Bla%' 而不是 '%Bla%')

我想知道是否有一种简便的方法可以做到这一点?

*下一个代码不能按我想要的方式工作,但只是显示了我正在寻找的东西

select * from Articles where title or category or post like '%Bla%'

有人知道是否有办法指定多个“where”列应使用相同的搜索值,而不为每一列列出相同的搜索值?

提前致谢!

【问题讨论】:

  • 以防万一您不知道,任何搜索LIKE '%Bla%' 每次都会进行表扫描(从上到下查看表中的每一行)。随着行数的增加,您会感到痛苦!

标签: sql sqlite


【解决方案1】:

我认为考虑到您正在使用 sqlite,您应该考虑使用全文搜索。它会让你尝试做的事情更有效率。

http://www.sqlite.org/cvstrac/wiki?p=FtsUsage

【讨论】:

  • 这比我要找的还要好!谢谢!
  • 我在尝试实现它时发现的一个问题是,表上不能有任何索引(除了内置的全文搜索索引)尝试运行时:CREATE UNIQUE INDEX “文章”上的“文章 ID”(“文章 ID”);它给出了错误:“虚拟表可能没有被索引”这意味着在加速全文搜索的同时,它会减慢我所有的正常查询,因为它必须进行全表扫描。人力资源管理普通查询会更重要(在我的情况下)所以不幸的是我认为这对我不起作用....
【解决方案2】:

我能想到的最快的事情是连接标题、类别和帖子,并查看连接的字符串是否匹配 '%Bla%'。为了使这项工作可靠,在连接时使用像“,”这样的分隔符(否则,你可以有标题“Bl”和cagegory“a”)。

我不知道在 SQL 中串联运算符是什么,我不确定是否存在于通用 SQL 或 SQLite 中。

我的想法是,它可能看起来像:

select * from Articles where concat(title, ',', category, ',', post) like '%Bla%'

【讨论】:

  • 来吧:title || '--' || category || '--' || post like '%Bla%'
【解决方案3】:

也许您想将您的字段连接成一个字符串,然后对它进行 LIKE?

select * from Articles where (title || ';' || category || ';' || post) like '%Bla%'

中间的分号是任意的,用于确保“ROB”和“lance”不会带来误报。

如果您根本不想提供这些字段,那就更复杂了...

【讨论】:

  • 奇怪的是,我只是查找了 SQLlite 的连接运算符,它是一个双管道。这可能使我的示例不必要地令人困惑。
  • 选择更好的分隔符。无论如何,我都会投票支持日产的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多