Pamiętaj tylko, że jeśli w ciągu znaków jest więcej niż „N” lub „Y”, może to być niedokładne. Zobacz rozwiązanie nickf, aby uzyskać bardziej niezawodną metodę.
Tom H
319
Ten fragment kodu działa w konkretnej sytuacji, w której masz wartość logiczną: odpowiada „ile jest elementów innych niż N?”.
SELECT LEN(REPLACE(col,'N',''))
Jeśli w innej sytuacji faktycznie próbowałeś policzyć wystąpienia określonego znaku (na przykład `` Y '') w dowolnym podanym ciągu, użyj tego:
Druga to najlepsza odpowiedź. Cała reszta polega na szczególnej sytuacji ciągu zawierającego tylko dwa różne znaki.
Steve Bennett
5
Tylko uwaga: w T-SQL musisz użyć LEN zamiast LENGTH.
Łukasz
4
@nickf Funkcja SQL len przycina końcowe spacje, więc jeśli szukasz liczby wystąpień spacji w ciągu, powiedzmy „Cześć”, otrzymasz 0. Najłatwiejszym sposobem byłoby dodanie końcowego znaku do ciągu przed i dostosowanie długości do więc. SELECT LEN (col + '~') - LEN (REPLACE (col, 'Y', '') + '~')
domenicr
3
Jeśli obawiasz się spacji końcowych, zamiast tego użyj funkcji DATALENGTH.
StevenWhite
2
@StevenWhite DATALENGTH zwraca liczbę użytych bajtów. Więc NVARCHAR zostanie podwojony.
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 To wzmacnia drugą sugestię @nickf, dzięki czemu będzie faktycznie wskazywać liczbę wystąpień ciągu, nawet jeśli szukany ciąg ma więcej niż 1 znak
Kevin Heidt
Edycja @ domenicr zepsuła tę odpowiedź i moja zmiana została odrzucona. Podział powinien nastąpić LEN(@StringToFind).
Jamie Kitson
@jamiek przeprosiny Przesłałem poprawiony kod, ale nie wiem, dlaczego Twoja zmiana została odrzucona.
domenicr
@domenicr Powinieneś powrócić do oryginalnego kodu, twoja edycja komplikuje kod bez celu, @StringToFindnigdy nie będzie pusta lub pusta.
Jamie Kitson
@JamieKitson Widzę inaczej. Sprawdzanie dzielenia przez zero jest zasadą najlepszych praktyk. Ponadto zliczenie liczby spacji Field To Searchdałoby dzielenie przez zero, ponieważ Len(' ')zwraca zero.
Jeśli chcesz policzyć liczbę wystąpień ciągów zawierających więcej niż jeden znak, możesz użyć poprzedniego rozwiązania z wyrażeniem regularnym lub to rozwiązanie używa STRING_SPLIT, które, jak sądzę, zostało wprowadzone w SQL Server 2016. Będziesz także potrzebować zgodności poziom 130 i wyższy.
Druga odpowiedź udzielona przez nickf jest bardzo sprytna. Jednak działa tylko dla długości znaku docelowego podłańcucha równej 1 i ignoruje spacje. W szczególności w moich danych były dwie wiodące spacje, które SQL z łatwością usuwa (nie wiedziałem o tym), gdy wszystkie znaki po prawej stronie zostaną usunięte. Co to znaczyło
" John Smith"
wygenerował 12 metodą Nickfa, natomiast:
„Joe Bloggs, John Smith”
wygenerowano 10 i
„Joe Bloggs, John Smith, John Smith”
Wygenerowano 20.
Dlatego nieznacznie zmodyfikowałem rozwiązanie do następującego, które działa dla mnie:
-- 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
-- ================================================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
Jeśli chcesz policzyć znak w łańcuchu z więcej niż 2 rodzajami znaków, możesz użyć zamiast 'n' -jakiegoś operatora lub wyrażenia regularnego znaków, zaakceptuj potrzebny znak.
Oto, czego użyłem w Oracle SQL, aby sprawdzić, czy ktoś przekazuje poprawnie sformatowany numer telefonu:
WHERE REPLACE(TRANSLATE('555-555-1212','0123456789-','00000000000'),'0','')ISNULLAND
LENGTH(REPLACE(TRANSLATE('555-555-1212','0123456789','0000000000'),'0',''))=2
Pierwsza część sprawdza, czy numer telefonu zawiera tylko cyfry i łącznik, a druga część sprawdza, czy numer telefonu ma tylko dwa łączniki.
Co to pytanie ma wspólnego z numerami telefonów? Prosi również o rozwiązanie T-SQL ...
Ben,
-1
na przykład, aby obliczyć liczbę wystąpień znaku (a) w kolumnie SQL -> nazwa to nazwa kolumny '' (a w doblequote jest puste, zastępuję a z nocharecter @ '')
wybierz len (name) - len (replace (name, 'a', '')) z TESTING
select len ('YYNYNYYNNNYYNY') - len (zamień ('YYNYNYYNNNYYNY', 'y', ''))
Odpowiedzi:
W SQL Server:
źródło
Ten fragment kodu działa w konkretnej sytuacji, w której masz wartość logiczną: odpowiada „ile jest elementów innych niż N?”.
Jeśli w innej sytuacji faktycznie próbowałeś policzyć wystąpienia określonego znaku (na przykład `` Y '') w dowolnym podanym ciągu, użyj tego:
źródło
To dawało mi dokładne wyniki za każdym razem ...
To jest w moim polu Stripes ...
Żółty, żółty, żółty, żółty, żółty, żółty, czarny, żółty, żółty, czerwony, żółty, żółty, żółty, czarny
źródło
źródło
LEN(@StringToFind)
.@StringToFind
nigdy nie będzie pusta lub pusta.Field To Search
dałoby dzielenie przez zero, ponieważLen(' ')
zwraca zero.Może coś takiego ...
źródło
Najprościej jest skorzystać z funkcji Oracle:
źródło
Zwróci liczbę wystąpień N
select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', '')) from Table
źródło
Spróbuj tego
źródło
Spróbuj tego. Określa nie. wystąpień pojedynczych znaków, a także wystąpień podłańcucha w ciągu głównym.
źródło
Jeśli chcesz policzyć liczbę wystąpień ciągów zawierających więcej niż jeden znak, możesz użyć poprzedniego rozwiązania z wyrażeniem regularnym lub to rozwiązanie używa STRING_SPLIT, które, jak sądzę, zostało wprowadzone w SQL Server 2016. Będziesz także potrzebować zgodności poziom 130 i wyższy.
.
źródło
Druga odpowiedź udzielona przez nickf jest bardzo sprytna. Jednak działa tylko dla długości znaku docelowego podłańcucha równej 1 i ignoruje spacje. W szczególności w moich danych były dwie wiodące spacje, które SQL z łatwością usuwa (nie wiedziałem o tym), gdy wszystkie znaki po prawej stronie zostaną usunięte. Co to znaczyło
" John Smith"
wygenerował 12 metodą Nickfa, natomiast:
„Joe Bloggs, John Smith”
wygenerowano 10 i
„Joe Bloggs, John Smith, John Smith”
Wygenerowano 20.
Dlatego nieznacznie zmodyfikowałem rozwiązanie do następującego, które działa dla mnie:
Jestem pewien, że ktoś może wymyślić lepszy sposób na zrobienie tego!
źródło
Możesz także spróbować tego
Wynik:
źródło
Poniższe rozwiązanie pomaga znaleźć brak znaku występującego w ciągu z ograniczeniem:
2) Wypróbuj poniższe rozwiązanie, aby uzyskać poprawne wyniki:
źródło
Jeśli chcesz policzyć znak w łańcuchu z więcej niż 2 rodzajami znaków, możesz użyć zamiast
'n' -
jakiegoś operatora lub wyrażenia regularnego znaków, zaakceptuj potrzebny znak.źródło
Oto, czego użyłem w Oracle SQL, aby sprawdzić, czy ktoś przekazuje poprawnie sformatowany numer telefonu:
Pierwsza część sprawdza, czy numer telefonu zawiera tylko cyfry i łącznik, a druga część sprawdza, czy numer telefonu ma tylko dwa łączniki.
źródło
wybierz len (name) - len (replace (name, 'a', '')) z TESTING
select len ('YYNYNYYNNNYYNY') - len (zamień ('YYNYNYYNNNYYNY', 'y', ''))
źródło