【问题标题】:SQLite WHERE-Clause for every column?每列的 SQLite WHERE 子句?
【发布时间】:2022-02-10 19:34:06
【问题描述】:

SQLite 是否提供了一种在表的每一列中搜索搜索键的方法?

SELECT * FROM table WHERE id LIKE ...

选择在id 列中找到... 的所有行。但是,如果只在id 列中搜索,我想在找到搜索字符串时搜索每一列。我相信这不起作用:

SELECT * FROM table WHERE * LIKE ...

这可能吗?或者下一个简单的方法是什么?

我使用 Python 3 来查询 SQLite 数据库。在执行查询并返回数据后,我应该去搜索字典吗?

【问题讨论】:

  • 您查看过全文选项吗? sqlite.org/fts3.html
  • 并非如此。通常,您需要为搜索的每一列命名。但是,如果您在很多列中搜索文本,您可能对全文索引感兴趣。

标签: sql sqlite


【解决方案1】:

一个简单的技巧是:

SELECT *
FROM table
WHERE ((col1+col2+col3+col4) LIKE '%something%')

如果这 4 列中的任何一列包含单词“something”,这将选择记录。

【讨论】:

  • 但是每一列都必须手动输入,对吗?或者有没有办法简单地自动选择所有列?我认为子选择是不可能的。
  • 有什么技巧可以让它运行吗?我没有得到使用这个的结果.. ``` SELECT * FROM personen WHERE ((vorname+nachname) LIKE '%David%') ```
  • @nuts:您使用的是哪个 RDBMS?如果不区分大小写,您的查询似乎很好。
  • @RagingBull 它是常规的 SQlite3,它不区分大小写。不过没关系,我的处理方式不同。不过谢谢:)
  • 谁能解释一下“+”在这种情况下的作用?即它究竟是如何工作的?我在网上的任何地方都找不到这方面的文档。
【解决方案2】:

没有;您必须列出或连接查询中的每一列,或者重新组织数据库以减少列。

SQLite 有full-text search tables,您可以在其中一次搜索所有列,但此类表不能有效地处理任何其他查询。

【讨论】:

  • 根据文档,默认情况下不启用 FTS 表的功能,需要重新编译二进制文件。
【解决方案3】:

我无法对@raging-bull answer 发表评论。所以我不得不写一个新的。我的问题是,我有带有 null 值的列并且没有结果,因为“搜索字符串”是 null

Using coalesce我可以解决这个问题。这里 sqlite 选择列内容,或者如果是 null 则为空字符串(“”)。所以有一个实际的搜索字符串可用。

SELECT *
FROM table
WHERE (coalesce(col1,"") || coalesce(col2,"") || coalesce(col3,"") || coalesce(col4,"")) LIKE '%something%')

【讨论】:

    【解决方案4】:

    我不太确定,如果我理解你的问题。 如果要返回整行,当 id=searchkey 时,则:

    select * from table where id=searchkey;
    

    如果您想从具有正确搜索键的行中获取特定列:

    select col1, col2, col3 from table where id=searchkey;
    

    如果您想在多个列中搜索“id”:首先缩小可以在哪些列中找到它 - 您不想搜索整个表!那么:

    select * from table where col1=searchkey or col2=searchkey or col3=searchkey;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      相关资源
      最近更新 更多