【问题标题】:sqlite search multiple columnsqlite搜索多列
【发布时间】:2012-09-26 02:05:27
【问题描述】:

我试图对表中的所有列执行区分大小写的搜索,所以我做了这样的事情

Select * From mytable Where col1 || '--' || col2 || '--' || etc like '%SomeValue%'

但它总是为大写和小写返回相同的结果。如果我这样做

Select * From mytable Where col1 like '%SomeValue%' OR col1 like '%SomeValue%' etc

我得到了想要的结果。这里的问题是我不能使用第二个查询,因为我有大约 36 列要搜索,并且写 col1 like '%SomeValue%' 最多 36 次是不必要的。

有人有解决办法吗?

【问题讨论】:

  • 您可能需要考虑使用 sqlite 全文,将文本分解为单词并创建“长模式”索引或键回身份或组合的单词。似乎扫描 36 列是错误的方法...
  • 我已经走了那条路,但它使所有其他查询变慢,我从这里得到了这个解决方案stackoverflow.com/questions/2428495/…
  • 不一定是其他查询的主要路径 - 更像是这些搜索的旁边的查找表。如果您希望它非常快,该搜索表也可以使用 sqlite 的全文编译版本。
  • 缺点是分词/索引的额外时间,或者如果索引上的一些延迟是可以接受的,您必须使其异步/后台。

标签: sqlite select


【解决方案1】:

一种解决方案是使用glob 而不是like

sqlite> select * from sqlite_master where ('foo' || '--' || 'bar') like '%Bar%';
table|t|t|2|CREATE TABLE t (a)
sqlite> select * from sqlite_master where ('foo' || '--' || 'bar') glob '*Bar*';
sqlite> select * from sqlite_master where ('foo' || '--' || 'bar') glob '*bar*';
table|t|t|2|CREATE TABLE t (a)
sqlite> 

另一种解决方案是使用pragma case_sensitive_like

sqlite> PRAGMA case_sensitive_like = 1;
sqlite> select * from sqlite_master where ('foo' || '--' || 'bar') like '%Bar%';
sqlite> select * from sqlite_master where ('foo' || '--' || 'bar') like '%bar%';
table|t|t|2|CREATE TABLE t (a)
sqlite> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多