1

我正在尝试对带有人名的 sql 表进行“模糊”搜索:

这是表格:

+----+------------+
| T1 | T2         |
+----+------------+
| 1  | Last,First |
| 2  | Last,First |
| 3  | Last,First |
+----+------------+

我想获得一个选择语句,我在其中T2使用LIKE运算符进行查询,这样即使您的查询是“First Last” ,它也可以工作

我能想到的唯一方法是拆分值并将它们连接起来,然后再次搜索条目。有一个更好的方法吗?

4

2 回答 2

5

是的,如果您有可能将两者都last, first放入first last数据库中,那么更好的方法是正确设计您的模式。

如果您发现自己试图搜索或以其他方式操作列的某些部分,那么您的架构几乎肯定会损坏。它几乎肯定会扼杀性能。

正确的方法是有这样的表:

T1  FirstName  LastName
==  =========  ========
 1  Pax        Diablo
 2  Bob        Smith
 3  George     Jones

然后,您可以更有效地拆分用户输入的名称(一次,在运行查询之前),而不是尝试拆分数据库中的每个名称。


数据库始终保存的情况下last, first,实际上可能不需要模式更改。

在这种情况下,您遇到的问题只是解释用户输入的内容之一。

尽管它是性能杀手,但一种可能性是like为每个单独的单词做一个。因此,如果用户输入pax diablo,您的查询结果可能是:

select T1 from mytable
    where T2 like '%pax%'
      and T2 like '%diablo%'

这样,您就不会太在意订单了。

但是,鉴于我不喜欢缓慢的查询,除非绝对必要(或者您的数据库相对较小并且可能保持这种状态),否则我会尽量避免这种情况。

有各种方法可以加快这些查询的速度,例如:

  • 使用您的 DBMS 拥有的任何全文搜索功能。
  • 通过在插入/更新触发器期间提取和存储单词(并在删除触发器期间删除它们)来模拟这种能力。
  • 前一种情况,但也确保额外的列与当前列的小写值一起使用(为了速度)。
  • 告诉用户他们需要使用last, first表单进行搜索。
  • 尽量避免%something%搜索字符串(使用something%, 索引仍然可以使用)。
  • 我之前提到的“将名称分成两列”的方法。
于 2012-08-14T03:01:52.633 回答
1

你可以试试这个。但更好的是通过分隔名称来重建表的模式。

SELECT *
FROM myTable
WHERE T2 LIKE CONCAT('%', 'First', '%','Last', '%') OR
      T2 LIKE CONCAT('%', 'Last', '%','First', '%')
于 2012-08-14T03:01:32.393 回答