Ich habe eine Spalte mit Werten, die wie a, b, c, d formatiert sind. Gibt es eine Möglichkeit, die Anzahl der Kommas in diesem Wert in T-SQL zu zählen?
sql-server
tsql
Orion Adrian
quelle
quelle
LTRIM
wie folgt um die Zeichenfolge wickeln :SELECT LEN(RTRIM(@string)) - LEN(REPLACE(RTRIM(@string), ',', ''))
?Schnelle Erweiterung der Antwort von cmsjr, die für Zeichenfolgen mit mehr als mehr Zeichen funktioniert.
Verwendung:
quelle
dbo.CountOccurancesOfString( 'blah ,', ',')
2 anstelle von 1 zurück unddbo.CountOccurancesOfString( 'hello world', ' ')
schlägt mit der Division durch Null fehl.DATALENGTH()/2
ist auch wegen nicht offensichtlicher Zeichengrößen schwierig. Unter stackoverflow.com/a/11080074/1094048 finden Sie eine einfache und genaue Möglichkeit.Sie können die Länge der Zeichenfolge mit einer Länge vergleichen, bei der die Kommas entfernt werden:
quelle
Aufbauend auf der Lösung von @ Andrew erhalten Sie eine viel bessere Leistung, wenn Sie eine nicht prozedurale Tabellenwertfunktion und CROSS APPLY verwenden:
quelle
Die Antwort von @csmjr hat in einigen Fällen ein Problem.
Seine Antwort war:
Dies funktioniert in den meisten Szenarien. Versuchen Sie jedoch Folgendes:
Aus irgendeinem Grund entfernt REPLACE das letzte Komma, aber AUCH das Leerzeichen davor (nicht sicher warum). Dies führt zu einem zurückgegebenen Wert von 5, wenn Sie 4 erwarten würden. Hier ist eine andere Möglichkeit, die auch in diesem speziellen Szenario funktioniert:
Beachten Sie, dass Sie keine Sternchen verwenden müssen. Jeder Ersatz durch zwei Zeichen reicht aus. Die Idee ist, dass Sie die Zeichenfolge für jede Instanz des Zeichens, das Sie zählen, um ein Zeichen verlängern und dann die Länge des Originals subtrahieren. Es ist im Grunde die entgegengesetzte Methode der ursprünglichen Antwort, die nicht mit dem seltsamen Nebeneffekt des Trimmens einhergeht.
quelle
quelle
Die akzeptierte Antwort ist korrekt und erweitert sie auf die Verwendung von 2 oder mehr Zeichen in der Teilzeichenfolge:
quelle
Wenn wir wissen, dass LEN und Speicherplatz begrenzt sind, warum können wir den Speicherplatz nicht zuerst ersetzen? Dann wissen wir, dass es keinen Raum gibt, um LEN zu verwirren.
quelle
quelle
Darrel Lee hat meiner Meinung nach eine ziemlich gute Antwort. Ersetzen Sie
CHARINDEX()
durchPATINDEX()
, und Sie können auchregex
entlang einer Zeichenfolge schwach suchen ...Angenommen, Sie verwenden dies für
@pattern
:Warum willst du vielleicht so etwas Verrücktes machen?
Angenommen, Sie laden begrenzte Textzeichenfolgen in eine Staging-Tabelle, in der das Feld, in dem sich die Daten befinden, so etwas wie ein Varchar (8000) oder ein Nvarchar (max) ist.
Manchmal ist es einfacher / schneller, ELT (Extract-Load-Transform) mit Daten anstelle von ETL (Extract-Transform-Load) durchzuführen, und eine Möglichkeit, dies zu tun, besteht darin, die begrenzten Datensätze unverändert in eine Staging-Tabelle zu laden, insbesondere wenn Vielleicht möchten Sie die außergewöhnlichen Datensätze einfacher anzeigen, als sie als Teil eines SSIS-Pakets zu behandeln ... aber das ist ein heiliger Krieg für einen anderen Thread.
quelle
Folgendes sollte den Trick sowohl für die Suche nach einzelnen als auch nach mehreren Zeichen ausführen:
Die Funktion kann mithilfe einer Zahlentabelle (dbo.Nums) etwas vereinfacht werden:
quelle
Verwenden Sie diesen Code, es funktioniert einwandfrei. Ich habe eine SQL-Funktion erstellt, die zwei Parameter akzeptiert. Der erste Parameter ist die lange Zeichenfolge, nach der gesucht werden soll, und sie kann eine Zeichenfolgenlänge von bis zu 1500 Zeichen akzeptieren (natürlich können Sie sie erweitern oder sogar in einen Textdatentyp ändern ). Und der zweite Parameter ist der Teilstring, mit dem wir die Anzahl seiner Vorkommen berechnen möchten (seine Länge beträgt bis zu 200 Zeichen, natürlich können Sie ihn nach Ihren Wünschen ändern). und die Ausgabe ist eine ganze Zahl, repräsentieren die Anzahl der Frequenzen ..... genießen Sie es.
quelle
Ich schreibe schließlich diese Funktion, die alle möglichen Situationen abdecken soll, indem ich der Eingabe ein Zeichenpräfix und ein Suffix hinzufüge. Dieses Zeichen unterscheidet sich von dem im Suchparameter enthaltenen Zeichen und kann daher das Ergebnis nicht beeinflussen.
Verwendung
quelle
quelle
In SQL 2017 oder höher können Sie Folgendes verwenden:
quelle
Dieser T-SQL-Code findet und druckt alle Vorkommen von Muster @p in Satz @s. Sie können den Satz anschließend beliebig bearbeiten.
das Ergebnis ist: 1 6 13 20
quelle
für SQL Server 2017
quelle
Sie können die folgende gespeicherte Prozedur verwenden, um Werte abzurufen.
quelle
@c1
auf die Antwort, die er benötigt. Was nützt der Rest des Codes, wenn man bedenkt, dass er eine bereits vorhandene Tabelle benötigt, umtable1
zu funktionieren, einen fest codierten Begrenzer hat und nicht wie die akzeptierte Antwort von zwei Monaten zuvor inline verwendet werden kann?Der Replace / Len-Test ist niedlich, aber wahrscheinlich sehr ineffizient (insbesondere in Bezug auf den Speicher). Eine einfache Funktion mit einer Schleife erledigt den Job.
quelle
Vielleicht sollten Sie Daten nicht so speichern. Es ist eine schlechte Praxis, jemals eine durch Kommas getrennte Liste in einem Feld zu speichern. IT ist für die Abfrage sehr ineffizient. Dies sollte eine verwandte Tabelle sein.
quelle