SQL question

testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

SQL question

Post by testuser »

I have a query, something like:

Code: Select all

SELECT * 
  FROM aaa
 WHERE aaa.field1 like '%some_stuff1%' or
      aaa.field1 like '%some_stuff2%'
      aaa.field1 like '%some_stuff3%'
      aaa.field1 like '%some_stuff4%'
      aaa.field1 like '%some_stuff5%'

table aaa
id  field1       
--  ------
1   some_stuff2
2   some_stuff5
3   some_stuff1
4   some_stuff3




Can I include a matching criteria (some_stuff) in selected fields?

the result should look like this

Code: Select all

id  field1       select_criteria
--  ------       ---------------
1   some_stuff2  %some_stuff2%
2   some_stuff5  %some_stuff5%
3   some_stuff1  %some_stuff1%
4   some_stuff3  %some_stuff3%


and this is going on on ORACLE database.
User avatar
katit
Уже с Приветом
Posts: 23804
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Post by katit »

Хм.. Первое что приходит на мысль это UNION
В SQL Server можно было-бы с CASE поиграться, но суть та-же..
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

1. А если много matching criteria подходит для одной записи ?

UNIOIN плох тем что идет scan много раз

Я бы делал такую колонку

select ...,case when COL like '%A%' then '%A%'
when COL like '%B%' then '%B%'
...
end
from
... or .... or ...
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Post by testuser »

katit wrote:Хм.. Первое что приходит на мысль это UNION
В SQL Server можно было-бы с CASE поиграться, но суть та-же..


I thought of UNION too, I'm not sure it will work fine with 100 or so LIKE statements I have. And it's just ugly, but since it's a one time thing to match one field to the other it's ok to have it this way.

I'll try it out ...
testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Post by testuser »

Dmitry67 wrote:1. А если много matching criteria подходит для одной записи ?

UNIOIN плох тем что идет scan много раз

Я бы делал такую колонку

select ...,case when COL like '%A%' then '%A%'
when COL like '%B%' then '%B%'
...
end
from
... or .... or ...


scan is ok, this is a small table that has about 200 rows in it.
I was told it's 1:1 or 1:null match, so no "много matching criteria подходит для одной записи ".

I beleive I can change CASE in SQL server with DECODE in Oracle ... Ok, may be I'll try this thing instead of UNION.
Mobi
Новичок
Posts: 99
Joined: 26 Jun 2000 09:01
Location: Atlanta, GA

Post by Mobi »

testuser wrote:
I beleive I can change CASE in SQL server with DECODE in Oracle ... Ok, may be I'll try this thing instead of UNION.


you don't need to. CASE works in ORACLE just fine (since 8i):

select id,
field1 ,
case when field1 like '%some_stuff1%' then '%some_stuff1%'
when field1 like '%some_stuff2%' then '%some_stuff2%'
else 'khren' end
from aaa
testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Post by testuser »

ok, thanks guys, UNION worked for me, but I'll keep in mind CASE for the future.
KPOKODIL
Уже с Приветом
Posts: 196
Joined: 13 Apr 2004 18:56

Post by KPOKODIL »

Mobi wrote: CASE works in ORACLE just fine (since 8i):


Вообще-то, не совсем just fine, потому что PL/SQL его не понимает в 8.1.7.

Не хотите все Ваши search criterias загнать в table , ну а дальше простой join?

Кстати, optimizer раскладывает OR's на UNION's .
testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Post by testuser »

KPOKODIL wrote:
Mobi wrote: CASE works in ORACLE just fine (since 8i):


Вообще-то, не совсем just fine, потому что PL/SQL его не понимает в 8.1.7.

Не хотите все Ваши search criterias загнать в table , ну а дальше простой join?

Кстати, optimizer раскладывает OR's на UNION's .


how "простой join" will look like - I have LIKE in there ...
KPOKODIL
Уже с Приветом
Posts: 196
Joined: 13 Apr 2004 18:56

Post by KPOKODIL »

testuser wrote:
KPOKODIL wrote:
Mobi wrote: CASE works in ORACLE just fine (since 8i):


Вообще-то, не совсем just fine, потому что PL/SQL его не понимает в 8.1.7.

Не хотите все Ваши search criterias загнать в table , ну а дальше простой join?

Кстати, optimizer раскладывает OR's на UNION's .


how "простой join" will look like - I have LIKE in there ...


create table t1 (c1 varchar2(10));
insert into t1 values ('a');
insert into t1 values ('b');
create table t2 (c2 varchar2(10));
insert into t2 values ('abc');
insert into t2 values ('bcd');
insert into t2 values ('xyz');
insert into t2 values ('xbz');

commit;

select t2.*, t1.c1
from t1,t2
where t2.c2 like '%'||t1.c1||'%'
/

C2 C1
---------- ----------
abc a
abc b
bcd b
xbz b

Return to “Вопросы и новости IT”