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-Key: 363764

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

Printed on: April 19, 2024 at 19:04 o'clock

Member: wiesi200
wiesi200 Feb 06, 2018 at 11:05:22 (UTC)
Goto Top
Hallo,

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

https://www.w3schools.com/sql/sql_where.asp
Member: emeriks
emeriks Feb 06, 2018 at 11:17:13 (UTC)
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.
Member: ukulele-7
ukulele-7 Feb 06, 2018 at 13:08:03 (UTC)
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?
Member: Biber
Biber Feb 07, 2018 updated at 09:21:22 (UTC)
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
Member: LianenSchwinger
LianenSchwinger Feb 23, 2018 updated at 09:13:05 (UTC)
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