我有这个查询
select name || ' ' || sure_name from users
有这个结果
'test test'
'test1 test1'
...
我需要为此查询创建一个过滤器。但我想知道创造它的最佳方式是什么。我想出了这个:
select name || ' ' || sure_name from users
where name || ' ' || sure_name = 'test test'
但是我想知道这个查询的效率如何,因为concating发生了两次(在select语句中,也在where语句中)
修改
过滤器看起来像
like '%test t'
答案 0 :(得分:4)
连接本身不是问题,而是对行的访问。
例如,如果您在sure_name或名称上有索引,则最好使用单独的列进行查询。
select name || ' ' || sure_name from users
where name ='test' and sure_name = 'test';
但如果你没有任何索引,请不要打扰。性能与您的查询大致相同。
但是,如果添加索引
create index fbi_full_name on users(name || ' ' || sure_name)
您的查询效果会更好。
答案 1 :(得分:3)
单独测试每个字段,以便在name
或sure_name
上有索引时,可以更有效地使用这些索引:
SELECT name || ' ' || sure_name
FROM users
WHERE name = 'test'
AND sure_name = 'test'
另请注意,如果名称或suname可以包含空格,则两个查询可以提供不同的结果。
答案 2 :(得分:3)
在这种情况下,我更喜欢使用子查询表达它:
select *
from (select (name || ' ' || sure_name) as newname
from users
) t
where newname = 'test test'
这样,我的where
逻辑与变量创建逻辑有点隔离。我发现它更容易阅读和维护。
答案 3 :(得分:1)
select *
from (
select name || ' ' || sure_name as fullname
from users
)
where fullname like '%test t'
答案 4 :(得分:0)
尝试此查询:
select name || ' ' || sure_name
from users
where (name || ' ' || sure_name) like '%test t'