3

我有这个查询

select name || ' ' || sure_name from users

有这个结果

'test test'
'test1 test1'
...

我需要为此查询创建一个过滤器。但我想知道创建它的最佳方法是什么。我想出了这个:

select name || ' ' || sure_name from users
where name || ' ' || sure_name = 'test test'

但我想知道这个查询的效率如何,因为连接发生了两次(在 select 语句和 where 语句中)

编辑

过滤器可能看起来像

like '%test t'
4

5 回答 5

4

连接本身不是问题,而是对行的访问。

例如,如果您在sure_name 或name 上有索引,则最好使用单独的列进行查询。

select name || ' ' || sure_name from users
where name ='test' and sure_name = 'test';

但是,如果您没有任何索引,请不要打扰。性能将与您的查询大致相同。

但是,如果您添加索引

create index fbi_full_name on users(name || ' ' || sure_name)

您的查询将执行得更好。

于 2013-01-29T14:07:44.760 回答
3

在这种情况下,我更喜欢使用子查询来表达这一点:

select *
from (select (name || ' ' || sure_name) as newname
      from users
     ) t
where newname = 'test test'

这样,我的where逻辑与变量创建逻辑更加隔离。我发现它更易于阅读和维护。

于 2013-01-29T14:08:41.243 回答
3

分别测试每个字段,以便如果您有索引,namesure_name可以更有效地使用这些索引:

SELECT name || ' ' || sure_name
FROM users
WHERE name = 'test'
AND sure_name = 'test'

另请注意,如果名称或名称可能包含空格,那么这两个查询可能会给出不同的结果。

于 2013-01-29T14:03:03.783 回答
1
select *
from (
   select name || ' ' || sure_name as fullname
   from users
) 
where fullname like '%test t'
于 2013-01-29T14:07:28.830 回答
0

试试这个查询:

select name || ' ' || sure_name 
from users
where (name || ' ' || sure_name) like '%test t'
于 2013-01-29T14:13:08.467 回答