Jak policzyć instancje znaków w kolumnie SQL

Mam kolumnę sql, która jest ciągiem 100 znaków " Y " lub "N". Na przykład:

YYNYNYYNNNY..

Jaki jest najprostszy sposób, aby uzyskać liczbę wszystkich symboli " Y " w każdym wierszu.

Author: gotqn, 2009-12-07

13 answers

If ms sql

SELECT LEN(REPLACE(myColumn, 'N', '')) FROM ...
 76
Author: David Hedlund,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-07 14:57:48

Ten fragment działa w konkretnej sytuacji, w której masz boolean: odpowiada "ile jest nie-Ns?".

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

Jeśli w innej sytuacji próbowałeś zliczyć wystąpienie określonego znaku (na przykład 'Y') w danym łańcuchu, użyj tego:

SELECT LEN(col) - LEN(REPLACE(col, 'Y', ''))
 247
Author: nickf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-20 10:44:46

To dawało mi dokładne wyniki za każdym razem...

To jest w moim polu pasków... Yellow,Yellow,Yellow,Yellow,Yellow,Black,Yellow,Yellow,Red,Yellow,Yellow,Yellow,Black
  • 11 żółci
  • 2 czarny
  • 1 Czerwony
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red') 
  FROM t_Contacts
 12
Author: Ron Sell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-05 21:01:14
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]
 12
Author: Aaron Dake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-20 21:33:39

Może coś takiego...

SELECT
    LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs
FROM
    SomeTable
 2
Author: Jason Punyon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-07 14:58:19

Najprostszym sposobem jest użycie funkcji Oracle:

SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME
 1
Author: Mayuresh Bhabal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-27 10:57:06

Spróbuj tego

declare @v varchar(250) = 'test.a,1  ;hheuw-20;'
-- LF   ;
select len(replace(@v,';','11'))-len(@v)
 0
Author: user5546076,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-10 10:06:31

Spróbuj Tego. Określa nr wystąpienia pojedynczego znaku, jak również wystąpienia podciągu w głównym łańcuchu.

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
Author: Himanshu Tiwari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-11 13:32:52

Jeśli chcesz policzyć liczbę instancji łańcuchów zawierających więcej niż jeden znak, możesz albo użyć poprzedniego rozwiązania z regex, albo To rozwiązanie używa STRING_SPLIT, które moim zdaniem zostało wprowadzone w SQL Server 2016. Będziesz również potrzebował poziomu kompatybilności 130 i wyższego.

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
Author: user3469285,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 17:24:49

Druga Odpowiedź udzielona przez nickf jest bardzo sprytna. Jednak działa tylko dla długości znaków docelowego podciągu 1 i ignoruje spacje. W szczególności w moich danych były dwie początkowe spacje, które SQL pomocnie usuwa (nie wiedziałem o tym), gdy wszystkie znaki po prawej stronie są usuwane. Co oznaczało, że

"John Smith"

Wygenerowano 12 używając metody Nickf, natomiast:

" Joe Bloggs, John Smith "

Wygenerowano 10, oraz

" Joe Bloggs, John Smith, John Smith "

Wygenerowano 20

Dlatego zmodyfikowałem nieco rozwiązanie do następującego, co mi działa:

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

Jestem pewien, że ktoś wymyśli lepszy sposób na zrobienie tego!

 0
Author: Statsanalyst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-14 17:26:01

Możesz również spróbować tego

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

Wyjście:

Tutaj wpisz opis obrazka

 0
Author: atik sarker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-20 11:51:52

Oto, czego użyłem w Oracle SQL, aby sprawdzić, czy ktoś podaje poprawnie sformatowany numer telefonu:

WHERE REPLACE(TRANSLATE('555-555-1212','0123456789-','00000000000'),'0','') IS NULL AND
LENGTH(REPLACE(TRANSLATE('555-555-1212','0123456789','0000000000'),'0','')) = 2

Pierwsza część sprawdza, czy numer telefonu ma tylko numery i myślnik, a druga część sprawdza, czy numer telefonu ma tylko dwa myślniki.

 -1
Author: TonyK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-05 21:00:02

Na przykład, aby obliczyć liczbę instancji znak (a) w kolumnie SQL - > nazwa to nazwa kolumny "(and in doblequote ' s is empty I am replace a with nocharecter @")

Select len(name)- len(replace (name,'a',")) from TESTING

select len ('YYNYNYYNNNYYNY') - len (replace ('YYNYNYYNNNYYNY', 'y',"))

 -1
Author: gady RajinikanthB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-11 12:39:45