3

私はこのクエリを持っています

select name || ' ' || sure_name from users

この結果があります

'test test'
'test1 test1'
...

このクエリのフィルターを作成する必要があります。しかし、私はそれを作成するための最良の方法は何でしょうか。私はこれを思いついた:

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

しかし、連結が2回行われるため(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

各フィールドを個別にテストして、インデックスをオンにしている場合、nameまたはsure_nameこれらのインデックスをより効率的に使用できるようにします。

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

名前または名前にスペースが含まれている可能性がある場合は、2つのクエリで異なる結果が得られる可能性があることにも注意してください。

于 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 に答える