Alternative zu SQL LIKE Befehl dieser findet zu viel
Hallo zusammen,
ich habe in einer Spalte folgenden Text
1. Datensatz: 250,4250,8953,436
2. Datensatz: 4250,8953,250
3. Datensatz: 8250,1250,7250
nun möchte ich wissen, wie oft die 250 vorkommt, aber nicht zb. die 8250... leider kann ich nicht klar sagen, in welchen zahlen die 250 noch vorkommt.
In den drei Datensätzte müsste ich also 2 rausbekommen, bekomme aber 7 raus.
SELECT COUNT (*) FROM karteieintrag WHERE CAST(TEXT AS VARCHAR(18)) LIKE '250' findet auch die 4250.
Hat jemand einen gedankenanstoß für mich?
Viele Grüße
Maffi
ich habe in einer Spalte folgenden Text
1. Datensatz: 250,4250,8953,436
2. Datensatz: 4250,8953,250
3. Datensatz: 8250,1250,7250
nun möchte ich wissen, wie oft die 250 vorkommt, aber nicht zb. die 8250... leider kann ich nicht klar sagen, in welchen zahlen die 250 noch vorkommt.
In den drei Datensätzte müsste ich also 2 rausbekommen, bekomme aber 7 raus.
SELECT COUNT (*) FROM karteieintrag WHERE CAST(TEXT AS VARCHAR(18)) LIKE '250' findet auch die 4250.
Hat jemand einen gedankenanstoß für mich?
Viele Grüße
Maffi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 363764
Url: https://administrator.de/contentid/363764
Ausgedruckt am: 24.11.2024 um 22:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo,
like ist ja dann auch Unsinn es soll ja gleich (=) sein
https://www.w3schools.com/sql/sql_where.asp
like ist ja dann auch Unsinn es soll ja gleich (=) sein
https://www.w3schools.com/sql/sql_where.asp
Moin Maffi,
wenn wir jetzt noch wüssten, mit welchem Datenbank-Blech du unterwegs bist, dann wären wir auch treffsicherer....
Versuch es so:
Anmerkung:
Grüße
Biber
wenn wir jetzt noch wüssten, mit welchem Datenbank-Blech du unterwegs bist, dann wären wir auch treffsicherer....
Versuch es so:
SELECT count(*)
FROM karteieintrag k
WHERE ','||trim(k.text)||',' LIKE '%,250,%'
;
-- oder--
SELECT count(*)
FROM karteieintrag k
WHERE CONCAT(',', trim(k.text),',') LIKE '%,250,%'
;
-- oder (siehe Anmerkung) --
SELECT count(*)
FROM karteieintrag k
WHERE CONCAT(',', REPLACE(k.text,' ', ''),',') LIKE '%,250,%'
;
Anmerkung:
- In deinen Beispieldaten war keine Rede von Leerzeichen in der kommaseparierten Liste im Feld TEXT. Sollten solche enthalten sein, dann würde ich die dritte Variante mit REPLACE() empfehlen
- Wie mutig muss man sein, um ein Tabellenfeld TEXT (=reservierter Name) zu nennen und dort eine Liste von Werte abzuspeichern? Auch wenn e kein reservierter Name wäre... es ist doch für keinen Nicht-Insider zu erahnen, was dieses ominöse Feld TEXT fachlich enthält.
Grüße
Biber
Hallo,
@Biber
bei Deinen Abfragen werden ja nur die Anzahl der Zeilen gezählt in denen die 250 vorkommt.
Aber was ist, wenn die 250 mehrmals in einem Datensatz vorkommt ('250,4250,8953,436,250,523')
Komma vor und nach konkatenieren war auch mein erster Gedanke.
In Oracle würde ich das so machen
Ergebnis liefert 2.
Entsprechend des Eingangsposts
G LianenSchwinger
@Biber
bei Deinen Abfragen werden ja nur die Anzahl der Zeilen gezählt in denen die 250 vorkommt.
Aber was ist, wenn die 250 mehrmals in einem Datensatz vorkommt ('250,4250,8953,436,250,523')
Komma vor und nach konkatenieren war auch mein erster Gedanke.
In Oracle würde ich das so machen
SELECT regexp_count(',' || '250,4250,8953,436,250,523' || ',', ',250,') count_250
FROM dual;
Entsprechend des Eingangsposts
SELECT SUM(count_250)
FROM (SELECT regexp_count(',' || k.text || ',',',250,') count_250
FROM karteieintrag k
);
G LianenSchwinger