Sql 如何组合两列以应用筛选器?

Sql 如何组合两列以应用筛选器?,sql,postgresql,select,Sql,Postgresql,Select,我有一个包含两列的表:first\u name和last\u name。在应用程序中,用户可以看到全名(如名字+姓氏) 例如: first_name last_name bat man Barack Obama 在应用程序中,如果用户搜索“蝙蝠侠”,则不会得到任何结果。 那么,如何使用这两列进行筛选 我当前的sql: select * from people where first_name ilike 'bat man' or last_name il

我有一个包含两列的表:
first\u name
last\u name
。在应用程序中,用户可以看到全名(如名字+姓氏)

例如:

first_name   last_name
bat          man
Barack       Obama
在应用程序中,如果用户搜索“蝙蝠侠”,则不会得到任何结果。
那么,如何使用这两列进行筛选

我当前的sql:

select * 
from people 
where first_name ilike 'bat man' 
or last_name ilike 'bat man'

您正在查找字符串连接运算符,
| |

SELECT *
  FROM people
 WHERE (first_name || ' ' || last_name) ILIKE 'bat man'

请参阅。

这样做的问题是,它使查询无法组织,因此每个查询都必须扫描整个表。幸运的是,Postgresql有一个可以创建的函数索引:在人员(first_name | | |“”| | last_name)上创建索引people_full_name;。从那时起,“where people\u full\u name ilike'batman'”将使用索引。@TommCatt:对不起,你的前提是错误的。如果在
first|name |“”| last_name
上创建函数索引,则PostgreSQL足够聪明,可以将其用于依赖于该表达式的查询。(请参阅,有趣的是,它使用了这个确切的示例。)如果您想提出这一点,这个查询不适合索引的原因是
ilike
。您是对的。我对Postgresql的了解足够多,可以了解函数索引(很多数据库都有),但没有深入了解
ilike
的细节。因此,在
lower(first_name | |‘| | last_name)
上创建索引,并将表达式更改为“where people_full_name like lower('bat man')”,甚至“where people_full_name=lower('bat man')”,因为不使用通配符。当然,“bat man”不会像我们的示例中那样硬编码。