Sida 1 av 1

SQL söka i concat kolumn

Postat: 7 november 2007, 13:22:40
av kifkroker
Hej

Jag har två kolumner, fornamn och efternamn, och vill söka i en sammansättning av dess kolumner. Någon som kan hjälpa till med en sql sats för detta?

För att förtydliga

Kod: Markera allt

select concat(fornamn, ' ', efternamn) as namn FROM personer
ger mig en kolumn med namnen ihopsatta efter önskemål, men jag vill nu göra en sökning i den kolumnen, det naturliga kändes att fyll på med

Kod: Markera allt

where namn like '%söktext%'
Men icke. Så några förslag, eller andra angreppssätt? Det går ju att göra omständiga workarounds på andra håll, men det vore skönt om någon hade en enkel sql sats istället. Satser efter varandra går också bort (ex. select into och sedan söka där)

Postat: 7 november 2007, 14:38:04
av nole
SELECT concat(name,' ' ,adress) as namn FROM trainers where concat(name, ' ' ,adress) regexp 'sven'

Fungerade fint för mig i Mysql 5.0 under linux.

EDIT: SELECT * from trainers where concat(name, ' ', adress) like "%sven%" lite snyggare.

Postat: 7 november 2007, 14:51:06
av sodjan
Subselect.

Kod: Markera allt

SELECT namn
  FROM (SELECT concat(fornamn, ' ', efternamn) AS namn FROM personer)
  WHERE namn ....
Exakt syntaxt kan variera med databasmotor, men i princip så...

Postat: 7 november 2007, 17:14:09
av kifkroker
fungerade fint på MySQL 3, stora tack!

Postat: 7 november 2007, 17:17:50
av sodjan
Vad fungerade fint ?

Postat: 7 november 2007, 20:35:54
av kifkroker
antingen min nya cykel som jag köpt, eller det jag efterfrågade här i tråden. Det tidigare svaret

Postat: 7 november 2007, 22:05:45
av sodjan
Vilket av dom ?

Postat: 7 november 2007, 22:09:56
av speakman
Cykeln?

Postat: 7 november 2007, 22:48:02
av nole
sodjan skrev:Vilket av dom ?
Båda mina SQL satser fungerar, men en av dem är mer lik det han efterfrågade att göra.

Postat: 8 november 2007, 15:12:06
av kifkroker
ok, här kommer en till sql sats som jag trodde var trivial men inte kan lösa (med fiktiva namn)

tabell:

Kod: Markera allt

Namn:Plagg
____________
Kalle:Skor
Kalle:Byxor
Johan:Skor
Kalle:Jacka
Johan:Jacka
Erik:Skor
Och jag undrar hur en sqlsats ser ut som svara på frågan: vilka namn har både skor och jacka?

Postat: 9 november 2007, 11:43:34
av nole
Ganska enkelt om man kör Mysql 5 eller senare (tror subselects kräver det i alla fall)

Kod: Markera allt

SELECT * from klader where namn = ANY(SELECT namn from klader where plagg = 'Skor') and plagg = 'Jacka'
Men annars vet jag inte..

Postat: 9 november 2007, 19:11:46
av sodjan
Har kört ett par tester. Bådes nole's och en modifierad variant
som även visar *båda* plaggen för de aktuella personerna.

Kod: Markera allt

$ @sql_test
$ sql$
--
-- Skapa en databas...
--
create database filename test1;
--
-- skapa en tabell...
--
create table klader
  (namn char(5),
   plagg char(5));
--
-- Lägg in lite testdata...
--
insert into klader values ('Kalle','Skor');
1 row inserted
insert into klader values ('Kalle','Byxor');
1 row inserted
insert into klader values ('Johan','Skor');
1 row inserted
insert into klader values ('Kalle','Jacka');
1 row inserted
insert into klader values ('Johan','Jacka');
1 row inserted
insert into klader values ('Erik','Skor');
1 row inserted
commit;
--
-- Först en enkel select...
--
select * from klader;

 NAMN    PLAGG   
 Kalle   Skor    
 Kalle   Byxor   
 Johan   Skor    
 Kalle   Jacka   
 Johan   Jacka   
 Erik    Skor    
6 rows selected

commit;
--
-- Sedan nole's select...
--
SELECT * from klader
  where namn = ANY(SELECT namn from klader where plagg = 'Skor')
  and plagg = 'Jacka';

 NAMN    PLAGG   
 Kalle   Jacka   
 Johan   Jacka   
2 rows selected

commit;
--
-- Sedan är modifierad varient som visar alla plagg...
--
select * from
  (select namn as t1_namn, plagg as t1_plagg
    from klader where plagg = 'Skor') as t1
  natural join
  (Select namn as t2_namn,plagg as t2_plagg
    from klader where plagg = 'Jacka') as t2
  where t1_namn = t2_namn;

 T1.T1_NAMN   T1.T1_PLAGG   T2.T2_NAMN   T2.T2_PLAGG   
 Kalle        Skor          Kalle        Jacka         
 Johan        Skor          Johan        Jacka         

2 rows selected
commit;
--
-- Kasta databasen...
--
drop database filename test1;
--
-- Klart !
--
exit
$ set nover
$
Kommandofilen ligger på mitt system och kan köras om man
telnet'ar in... Se tråden : http://elektronikforumet.com/forum/view ... hp?t=21877