maffi
Goto Top

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

Content-ID: 363764

Url: https://administrator.de/contentid/363764

Ausgedruckt am: 24.11.2024 um 22:11 Uhr

wiesi200
wiesi200 06.02.2018 um 12:05:22 Uhr
Goto Top
Hallo,

like ist ja dann auch Unsinn es soll ja gleich (=) sein

https://www.w3schools.com/sql/sql_where.asp
emeriks
emeriks 06.02.2018 um 12:17:13 Uhr
Goto Top
Hi,
Denkfehler.
SELECT COUNT (*) FROM karteieintrag WHERE CAST(TEXT AS VARCHAR(18)) = '250' OR CAST(TEXT AS VARCHAR(18)) LIKE '250,%' OR CAST(TEXT AS VARCHAR(18)) LIKE '%,250,%' OR CAST(TEXT AS VARCHAR(18)) LIKE '%,250'  

E.
ukulele-7
ukulele-7 06.02.2018 um 14:08:03 Uhr
Goto Top
emeriks hat die Antwort bereits gegeben, dein Ausgangspost ist allerdings falsch, LIKE '250' kann kein 4250 finden. Oder welches SQL soll das sein?
Biber
Biber 07.02.2018 aktualisiert um 10:21:22 Uhr
Goto Top
Moin Maffi,

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
LianenSchwinger
LianenSchwinger 23.02.2018 aktualisiert um 10:13:05 Uhr
Goto Top
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
SELECT regexp_count(',' || '250,4250,8953,436,250,523' || ',', ',250,') count_250  
FROM dual;
Ergebnis liefert 2.

Entsprechend des Eingangsposts
SELECT SUM(count_250)
FROM (SELECT regexp_count(',' || k.text || ',',',250,') count_250  
      FROM karteieintrag k
     );

G LianenSchwinger