SELECT innerhalb einer Spalte

digidax

Benutzer
Beiträge
11
Hallo zusammen,

folgende abstakte Tabelle:

Code:
+-------+----------+
| kombi | frucht   |
+-------+----------+
|     1 | Apfel    |
|     2 | Birne    |
|     3 | Apfel    |
|     3 | Birne    |
+-------+----------+


Der Suchstring könnte einer der folgenden sein:
Apfel
Birne
Apfel Birne
Birne Apfel

Erwartetes Ergebnis (kombi)
Apfel => 1
Birne => 2
Apfel Birne => 3
Birne Apfel => 3

Das Beispiel ist abstrakt, die Anzahl der Früchte, welche den gemeinsamen Wert "kombi" haben könnten ist > 1.

Kann man das mit einem SELECT statement lösen?

Danke für Eure Hilfe, ich grübel schon seit einer Woche.

Frank
 
Werbung:
Ja, das müsste sogar mit mysql gehen.
Bilde ein StringAggregat aus der durchsuchten Spalte und wende darauf Deinen Suchtext an.

Anders wäre schöner, nämlich umgekehrt. Zerlege den Suchausdruck in ein Array bzw. Records und matche das mit den "Rohdaten" (unaggregiert) in der Tabelle. Da hab ich aber keine Lösung für mySQL im Sinn. Es wäre vermutlich deutlich schneller/effizienter, besonders bei großen Datenmengen.
 
Code:
edb=*# select * from digidax ;
 kombi | frucht
-------+--------
     1 | Apfel
     2 | Birne
     3 | Apfel
     3 | Birne
(4 rows)
edb=*# with foo as (select kombi, array_agg(frucht) a from digidax group by kombi) select * from foo where a @>  array['Apfel'] and a <@ array['Apfel'];
 kombi |    a   
-------+---------
     1 | {Apfel}
(1 row)

edb=*# with foo as (select kombi, array_agg(frucht) a from digidax group by kombi) select * from foo where a @>  array['Birne'] and a <@ array['Birne'];
 kombi |    a   
-------+---------
     2 | {Birne}
(1 row)
edb=*# with foo as (select kombi, array_agg(frucht) a from digidax group by kombi) select * from foo where a @>  array['Birne','Apfel'] and a <@ array['Birne','Apfel'];
 kombi |       a       
-------+---------------
     3 | {Apfel,Birne}
(1 row)

edb=*#
edb=*#
edb=*# with foo as (select kombi, array_agg(frucht) a from digidax group by kombi) select * from foo where a @>  array['Apfel','Birne'] and a <@ array['Apfel','Birne'];
 kombi |       a       
-------+---------------
     3 | {Apfel,Birne}
(1 row)

oder noch etwas einfacher:

Code:
edb=*# with foo as (select kombi, array_agg(frucht) a, array['Apfel'] b from digidax group by kombi) select * from foo where a @>  b and a <@ b;
 kombi |    a    |    b   
-------+---------+---------
     1 | {Apfel} | {Apfel}
(1 row)

edb=*# with foo as (select kombi, array_agg(frucht) a, array['Apfel','Birne'] b from digidax group by kombi) select * from foo where a @>  b and a <@ b;
 kombi |       a       |       b       
-------+---------------+---------------
     3 | {Apfel,Birne} | {Apfel,Birne}
(1 row)

edb=*# with foo as (select kombi, array_agg(frucht) a, array['Birne','Apfel'] b from digidax group by kombi) select * from foo where a @>  b and a <@ b;
 kombi |       a       |       b       
-------+---------------+---------------
     3 | {Apfel,Birne} | {Birne,Apfel}
(1 row)

edb=*#

Setzt natürlich eine DB voraus, die effektiv mit Arrays arbeiten kann.
 
Phantastisch, Respekt für diese Leistung, dann scheitert es nur bei mir an der DB, ich habe leider nur MariaDB zur Verfügung.
Diese meckert: Fehler in der SQL-Abfrage (1064): Syntax error near '['Apfel'] b from digidax group by kombi) select * from foo where a @> b and a <' at line 1

Habe SQLines - Online SQL Conversion - SQL Scripts, DDL, Queries, Views, Stored Procedures, Triggers, Embedded SQL versucht, aber da ist kein Unterschied von PgSQL zu MySQL / MariaDB im Query. Wahrschnelich kann es das auch nicht.
 
Werbung:
Wahrschnelich kann es das auch nicht.
Das ist bedauerlich, darf man fragen was "zur Verfügung" bedeutet? Runterladen und installieren eine Datenbank dauert 10 Minuten.
Hast du mal eine String Aggregation versucht, wie ich oben vorgeschlagen habe? Das geht auch mit Maria, es geht mit jeder Schangel DB, die Stringlisten aggregieren kann.
 
Zurück
Oben