Beachten Sie jedoch, dass dies möglicherweise ungenau ist, wenn die Zeichenfolge mehr als "N" oder "Y" enthält. Siehe robfs Lösung für eine robustere Methode.
Tom H
319
Dieses Snippet funktioniert in der speziellen Situation, in der Sie einen Booleschen Wert haben: Es antwortet "Wie viele Nicht-Ns gibt es?".
SELECT LEN(REPLACE(col,'N',''))
Wenn Sie in einer anderen Situation tatsächlich versucht haben, das Vorkommen eines bestimmten Zeichens (z. B. 'Y') in einer bestimmten Zeichenfolge zu zählen, verwenden Sie Folgendes:
Die zweite ist hier die beste Antwort. Der Rest hängt von der besonderen Situation der Zeichenfolge ab, die nur zwei verschiedene Zeichen enthält.
Steve Bennett
5
Nur eine Anmerkung: In T-SQL müssen Sie LEN anstelle von LENGTH verwenden.
Luke
4
Die Funktion @nickf SQL len schneidet nachgestellte Leerzeichen ab. Wenn Sie also nach der Anzahl der Vorkommen eines Leerzeichens in einer Zeichenfolge suchen, sagen wir "Hallo", erhalten Sie 0. Am einfachsten ist es, der Zeichenfolge zuvor ein nachfolgendes Zeichen hinzuzufügen und len wie anzupassen so. SELECT LEN (col + '~') - LEN (REPLACE (col, 'Y', '') + '~')
domenicr
3
Wenn Sie sich Gedanken über nachgestellte Leerzeichen machen, verwenden Sie stattdessen die Funktion DATALENGTH.
StevenWhite
2
@StevenWhite DATALENGTH gibt die Anzahl der verwendeten Bytes zurück. NVARCHAR wird also verdoppelt.
DECLARE@StringToFind VARCHAR(100)="Text To Count"SELECT(LEN([Field To Search])- LEN(REPLACE([Field To Search],@StringToFind,'')))/COALESCE(NULLIF(LEN(@StringToFind),0),1)--protect division from zeroFROM[TableTo Search]
+1 Dies verbessert den zweiten Vorschlag von @nickf, so dass tatsächlich die Anzahl der Instanzen einer Zeichenfolge angezeigt wird, selbst wenn die gesuchte Zeichenfolge mehr als 1 Zeichen enthält
Kevin Heidt
Die Bearbeitung von @ domenicr hat diese Antwort gebrochen und meine Bearbeitung wurde abgelehnt. Die Aufteilung sollte durch sein LEN(@StringToFind).
Jamie Kitson
@ jamiek Entschuldigung Ich habe korrigierten Code eingereicht, weiß aber nicht, warum Ihre Bearbeitung abgelehnt wurde.
Domenicr
@domenicr Sie sollten zum ursprünglichen Code zurückkehren. Ihre Bearbeitung verkompliziert den Code ohne Zweck und @StringToFindwird niemals null oder leer sein.
Jamie Kitson
@ JamieKitson Ich sehe anders. Die Überprüfung auf eine Division durch Null ist ein Prinzip der Best Practices. Außerdem würde das Zählen der Anzahl der Leerzeichen Field To Searcheine Division durch Null erhalten, da Len(' ')Null zurückgegeben wird.
Domenicr
2
Vielleicht so etwas ...
SELECT
LEN(REPLACE(ColumnName,'N',''))as NumberOfYs
FROM
SomeTable
Wenn Sie die Anzahl der Instanzen von Zeichenfolgen mit mehr als einem Zeichen zählen möchten, können Sie entweder die vorherige Lösung mit Regex verwenden oder diese Lösung verwendet STRING_SPLIT, das meiner Meinung nach in SQL Server 2016 eingeführt wurde. Außerdem benötigen Sie Kompatibilität Stufe 130 und höher.
Die zweite Antwort von nickf ist sehr klug. Es funktioniert jedoch nur für eine Zeichenlänge der Zielunterzeichenfolge von 1 und ignoriert Leerzeichen. Insbesondere gab es zwei führende Leerzeichen in meinen Daten, die SQL hilfreich entfernt (ich wusste das nicht), wenn alle Zeichen auf der rechten Seite entfernt werden. Was das bedeutete
" John Smith"
erzeugte 12 mit Nickfs Methode, während:
"Joe Bloggs, John Smith"
generiert 10 und
"Joe Bloggs, John Smith, John Smith"
Generiert 20.
Ich habe die Lösung daher leicht wie folgt geändert, was für mich funktioniert:
-- DECLARE field because your table type may be textDECLARE@mmRxClaim nvarchar(MAX)-- Getting Value from tableSELECTtop(1)@mmRxClaim = mRxClaim FROM RxClaim WHERE rxclaimid_PK =362-- Main String ValueSELECT@mmRxClaim AS MainStringValue
-- Count Multiple Character for this number of space will be number of characterSELECT LEN(@mmRxClaim)- LEN(REPLACE(@mmRxClaim,'GS',' '))AS CountMultipleCharacter
-- Count Single Character for this number of space will be oneSELECT LEN(@mmRxClaim)- LEN(REPLACE(@mmRxClaim,'G',''))AS CountSingleCharacter
Die folgende Lösungshilfe hilft, herauszufinden, welches Zeichen in einer Zeichenfolge mit einer Einschränkung vorhanden ist:
1) Verwenden von SELECT LEN (REPLACE (myColumn, 'N', '')), aber Einschränkung und falsche Ausgabe in der folgenden Bedingung:
SELECT LEN (REPLACE ('YYNYNYYNNNYYNY', 'N', ''));
--8 - Richtig
SELECT LEN (REPLACE ('123a123a12', 'a', ''));
--8 - Falsch
SELECT LEN (REPLACE ('123a123a12', '1', ''));
--7 - Falsch
2) Versuchen Sie es mit der folgenden Lösung für die korrekte Ausgabe:
Erstellen Sie eine Funktion und ändern Sie sie nach Bedarf.
Und rufen Sie die Funktion wie unten beschrieben auf
Wählen Sie dbo.vj_count_char_from_string ('123a123a12', '2').
--2 - Richtig
Wählen Sie dbo.vj_count_char_from_string ('123a123a12', 'a').
--2 - Richtig
-- ================================================SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================-- Author: VIKRAM JAIN-- Create date: 20 MARCH 2019-- Description: Count char from string-- =============================================createFUNCTION vj_count_char_from_string
(@string nvarchar(500),@find_char char(1))
RETURNS integer
ASBEGIN-- Declare the return variable hereDECLARE@total_char int;DECLARE@position INT;SET@total_char=0;set@position =1;-- Add the T-SQL statements to compute the return value hereif LEN(@string)>0BEGINWHILE@position <= LEN(@string)-1BEGINif SUBSTRING(@string,@position,1)=@find_char
BEGINSET@total_char+=1;ENDSET@position+=1;ENDEND;-- Return the result of the functionRETURN@total_char;END
GO
Wenn Sie das Zeichen in einer Zeichenfolge mit mehr als zwei Arten von Zeichen zählen müssen, können Sie anstelle eines 'n' -Operators oder eines regulären Ausdrucks der Zeichen das Zeichen verwenden, das Sie benötigen.
Folgendes habe ich in Oracle SQL verwendet, um festzustellen, ob jemand eine korrekt formatierte Telefonnummer übergeben hat:
WHERE REPLACE(TRANSLATE('555-555-1212','0123456789-','00000000000'),'0','')ISNULLAND
LENGTH(REPLACE(TRANSLATE('555-555-1212','0123456789','0000000000'),'0',''))=2
Der erste Teil prüft, ob die Telefonnummer nur Nummern und der Bindestrich enthält, und der zweite Teil prüft, ob die Telefonnummer nur zwei Bindestriche enthält.
Was hat diese Frage mit Telefonnummern zu tun? Es wird auch nach einer T-SQL-Lösung gefragt ...
Ben
-1
Zum Beispiel, um die Anzahl der Instanzen von Zeichen (a) in der SQL-Spalte zu berechnen -> Name ist Spaltenname '' (und in doblequote ist leer Ich ersetze a durch nocharecter @ '')
Wählen Sie len (name) - len (replace (name, 'a', '')) aus TESTING
Wählen Sie len ('YYNYNYYNNNYYNY') - len (ersetzen ('YYNYNYYNNNYYNY', 'y', ''))
Antworten:
In SQL Server:
quelle
Dieses Snippet funktioniert in der speziellen Situation, in der Sie einen Booleschen Wert haben: Es antwortet "Wie viele Nicht-Ns gibt es?".
Wenn Sie in einer anderen Situation tatsächlich versucht haben, das Vorkommen eines bestimmten Zeichens (z. B. 'Y') in einer bestimmten Zeichenfolge zu zählen, verwenden Sie Folgendes:
quelle
Dies gab mir jedes Mal genaue Ergebnisse ...
Dies ist in meinem Stripes-Feld ...
Gelb, Gelb, Gelb, Gelb, Gelb, Gelb, Schwarz, Gelb, Gelb, Rot, Gelb, Gelb, Gelb, Schwarz
quelle
quelle
LEN(@StringToFind)
.@StringToFind
wird niemals null oder leer sein.Field To Search
eine Division durch Null erhalten, daLen(' ')
Null zurückgegeben wird.Vielleicht so etwas ...
quelle
Der einfachste Weg ist die Verwendung der Oracle-Funktion:
quelle
Dies gibt die Anzahl der Vorkommen von N zurück
select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', '')) from Table
quelle
Versuche dies
quelle
Versuche dies. Es bestimmt die Nr. von Vorkommen einzelner Zeichen sowie von Vorzeichenfolgen in der Hauptzeichenfolge.
quelle
Wenn Sie die Anzahl der Instanzen von Zeichenfolgen mit mehr als einem Zeichen zählen möchten, können Sie entweder die vorherige Lösung mit Regex verwenden oder diese Lösung verwendet STRING_SPLIT, das meiner Meinung nach in SQL Server 2016 eingeführt wurde. Außerdem benötigen Sie Kompatibilität Stufe 130 und höher.
.
quelle
Die zweite Antwort von nickf ist sehr klug. Es funktioniert jedoch nur für eine Zeichenlänge der Zielunterzeichenfolge von 1 und ignoriert Leerzeichen. Insbesondere gab es zwei führende Leerzeichen in meinen Daten, die SQL hilfreich entfernt (ich wusste das nicht), wenn alle Zeichen auf der rechten Seite entfernt werden. Was das bedeutete
" John Smith"
erzeugte 12 mit Nickfs Methode, während:
"Joe Bloggs, John Smith"
generiert 10 und
"Joe Bloggs, John Smith, John Smith"
Generiert 20.
Ich habe die Lösung daher leicht wie folgt geändert, was für mich funktioniert:
Ich bin sicher, jemand kann sich einen besseren Weg vorstellen!
quelle
Sie können dies auch versuchen
Ausgabe:
quelle
Die folgende Lösungshilfe hilft, herauszufinden, welches Zeichen in einer Zeichenfolge mit einer Einschränkung vorhanden ist:
2) Versuchen Sie es mit der folgenden Lösung für die korrekte Ausgabe:
quelle
Wenn Sie das Zeichen in einer Zeichenfolge mit mehr als zwei Arten von Zeichen zählen müssen, können Sie anstelle eines
'n' -
Operators oder eines regulären Ausdrucks der Zeichen das Zeichen verwenden, das Sie benötigen.quelle
Folgendes habe ich in Oracle SQL verwendet, um festzustellen, ob jemand eine korrekt formatierte Telefonnummer übergeben hat:
Der erste Teil prüft, ob die Telefonnummer nur Nummern und der Bindestrich enthält, und der zweite Teil prüft, ob die Telefonnummer nur zwei Bindestriche enthält.
quelle
Wählen Sie len (name) - len (replace (name, 'a', '')) aus TESTING
Wählen Sie len ('YYNYNYYNNNYYNY') - len (ersetzen ('YYNYNYYNNNYYNY', 'y', ''))
quelle