So zählen Sie Zeicheninstanzen in der SQL-Spalte


111

Ich habe eine SQL-Spalte, die eine Zeichenfolge mit 100 'Y' oder 'N' Zeichen ist. Beispielsweise:

YYNYNYYNNNYYNY ...

Was ist der einfachste Weg, um die Anzahl aller Y-Symbole in jeder Zeile zu ermitteln?


1
Können Sie die Plattform angeben? MySQL, MSSQl, Oracle?
Vincent Ramdhanie

Ja - mit Oracle scheint es, dass Sie Länge brauchen - nicht len
JGFMK

Antworten:


96

In SQL Server:

SELECT LEN(REPLACE(myColumn, 'N', '')) 
FROM ...

18
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:

SELECT LEN(col) - LEN(REPLACE(col, 'Y', ''))

32
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.
Domenicr

18

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

  • 11 Gelb
  • 2 Schwarz
  • 1 Rot
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red') 
  FROM t_Contacts

Das ist ein sehr kluger Weg! Vielen Dank
Thelt

13
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 zero
FROM [Table To 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

1

Der einfachste Weg ist die Verwendung der Oracle-Funktion:

SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME

1

Dies gibt die Anzahl der Vorkommen von N zurück

select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', '')) from Table


0

Versuche dies

declare @v varchar(250) = 'test.a,1  ;hheuw-20;'
-- LF   ;
select len(replace(@v,';','11'))-len(@v)

0

Versuche dies. Es bestimmt die Nr. von Vorkommen einzelner Zeichen sowie von Vorzeichenfolgen in der Hauptzeichenfolge.

SELECT COUNT(DECODE(SUBSTR(UPPER(:main_string),rownum,LENGTH(:search_char)),UPPER(:search_char),1)) search_char_count
FROM DUAL
connect by rownum <= length(:main_string);

0

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.

ALTER DATABASE [database_name] SET COMPATIBILITY_LEVEL = 130

.

--some data
DECLARE @table TABLE (col varchar(500))
INSERT INTO @table SELECT 'whaCHAR(10)teverCHAR(10)whateverCHAR(10)'
INSERT INTO @table SELECT 'whaCHAR(10)teverwhateverCHAR(10)'
INSERT INTO @table SELECT 'whaCHAR(10)teverCHAR(10)whateverCHAR(10)~'

--string to find
DECLARE @string varchar(100) = 'CHAR(10)'

--select
SELECT 
    col
  , (SELECT COUNT(*) - 1 FROM STRING_SPLIT (REPLACE(REPLACE(col, '~', ''), 'CHAR(10)', '~'), '~')) AS 'NumberOfBreaks'
FROM @table

0

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:

Select (len(replace(Sales_Reps,' ',''))- len(replace((replace(Sales_Reps, ' ','')),'JohnSmith','')))/9 as Count_JS

Ich bin sicher, jemand kann sich einen besseren Weg vorstellen!


0

Sie können dies auch versuchen

-- DECLARE field because your table type may be text
DECLARE @mmRxClaim nvarchar(MAX) 

-- Getting Value from table
SELECT top (1) @mmRxClaim = mRxClaim FROM RxClaim WHERE rxclaimid_PK =362

-- Main String Value
SELECT @mmRxClaim AS MainStringValue

-- Count Multiple Character for this number of space will be number of character
SELECT LEN(@mmRxClaim) - LEN(REPLACE(@mmRxClaim, 'GS', ' ')) AS CountMultipleCharacter

-- Count Single Character for this number of space will be one
SELECT LEN(@mmRxClaim) - LEN(REPLACE(@mmRxClaim, 'G', '')) AS CountSingleCharacter

Ausgabe:

Geben Sie hier die Bildbeschreibung ein


0

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
-- =============================================
create FUNCTION vj_count_char_from_string
(
    @string nvarchar(500),
    @find_char char(1)  
)
RETURNS integer
AS
BEGIN
    -- Declare the return variable here
    DECLARE @total_char int; DECLARE @position INT;
    SET @total_char=0; set @position = 1;

    -- Add the T-SQL statements to compute the return value here
    if LEN(@string)>0
    BEGIN
        WHILE @position <= LEN(@string) -1
        BEGIN
            if SUBSTRING(@string, @position, 1) = @find_char
            BEGIN
                SET @total_char+= 1;
            END
            SET @position+= 1;
        END
    END;

    -- Return the result of the function
    RETURN @total_char;

END
GO

0

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.

SELECT LEN(REPLACE(col, 'N', ''))

-1

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','') IS NULL AND
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', ''))

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.