SQL söka i concat kolumn

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
kifkroker
Inlägg: 405
Blev medlem: 15 september 2006, 01:22:46
Ort: Oslo

SQL söka i concat kolumn

Inlägg 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)
Användarvisningsbild
nole
Inlägg: 651
Blev medlem: 10 januari 2006, 12:18:00
Ort: Borlänge

Inlägg 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.
Senast redigerad av nole 7 november 2007, 15:03:23, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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å...
Användarvisningsbild
kifkroker
Inlägg: 405
Blev medlem: 15 september 2006, 01:22:46
Ort: Oslo

Inlägg av kifkroker »

fungerade fint på MySQL 3, stora tack!
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Vad fungerade fint ?
Användarvisningsbild
kifkroker
Inlägg: 405
Blev medlem: 15 september 2006, 01:22:46
Ort: Oslo

Inlägg av kifkroker »

antingen min nya cykel som jag köpt, eller det jag efterfrågade här i tråden. Det tidigare svaret
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Vilket av dom ?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Cykeln?
Användarvisningsbild
nole
Inlägg: 651
Blev medlem: 10 januari 2006, 12:18:00
Ort: Borlänge

Inlägg 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.
Användarvisningsbild
kifkroker
Inlägg: 405
Blev medlem: 15 september 2006, 01:22:46
Ort: Oslo

Inlägg 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?
Användarvisningsbild
nole
Inlägg: 651
Blev medlem: 10 januari 2006, 12:18:00
Ort: Borlänge

Inlägg 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..
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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
Skriv svar