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”不会像我们的示例中那样硬编码。