过滤在连续的列上

时间:2013-01-29 14:00:47

标签: sql oracle

我有这个查询

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'

5 个答案:

答案 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)

单独测试每个字段,以便在namesure_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'