Ho una colonna sql che è una stringa di 100 caratteri "Y" o "N". Per esempio:
YYNYNYYNNNYYNY ...
Qual è il modo più semplice per ottenere il conteggio di tutti i simboli "Y" in ogni riga.
Ho una colonna sql che è una stringa di 100 caratteri "Y" o "N". Per esempio:
YYNYNYYNNNYYNY ...
Qual è il modo più semplice per ottenere il conteggio di tutti i simboli "Y" in ogni riga.
Risposte:
In SQL Server:
SELECT LEN(REPLACE(myColumn, 'N', ''))
FROM ...
Questo snippet funziona nella situazione specifica in cui hai un booleano: risponde "quanti non N ci sono?".
SELECT LEN(REPLACE(col, 'N', ''))
Se, in una situazione diversa, stavi effettivamente cercando di contare le occorrenze di un certo carattere (ad esempio "Y") in una determinata stringa, utilizza questo:
SELECT LEN(col) - LEN(REPLACE(col, 'Y', ''))
Questo mi ha dato risultati accurati ogni volta ...
Questo è nel mio campo Stripes ...
Giallo, giallo, giallo, giallo, giallo, giallo, nero, giallo, giallo, rosso, giallo, giallo, giallo, nero
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red')
FROM t_Contacts
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]
LEN(@StringToFind)
.
@StringToFind
non sarà mai nullo o vuoto.
Field To Search
si otterrebbe una divisione per zero perché Len(' ')
restituisce zero.
Forse qualcosa del genere ...
SELECT
LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs
FROM
SomeTable
Il modo più semplice è utilizzare la funzione Oracle:
SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME
Ciò restituirà il numero di occorrenza di N
select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', ''))
from Table
prova questo
declare @v varchar(250) = 'test.a,1 ;hheuw-20;'
-- LF ;
select len(replace(@v,';','11'))-len(@v)
Prova questo. Determina il n. delle occorrenze di un singolo carattere così come delle occorrenze di sottostringa nella stringa principale.
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);
Se vuoi contare il numero di istanze di stringhe con più di un singolo carattere, puoi utilizzare la soluzione precedente con regex oppure questa soluzione utilizza STRING_SPLIT, che credo sia stato introdotto in SQL Server 2016. Inoltre avrai bisogno di compatibilità livello 130 e superiore.
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
La seconda risposta fornita da nickf è molto intelligente. Tuttavia, funziona solo per una lunghezza di caratteri della sottostringa di destinazione di 1 e ignora gli spazi. In particolare, c'erano due spazi iniziali nei miei dati, che SQL rimuove utilmente (non lo sapevo) quando tutti i caratteri sul lato destro vengono rimossi. Il che significava quello
" John Smith"
ne ha generati 12 utilizzando il metodo di Nickf, mentre:
"Joe Bloggs, John Smith"
generato 10 e
"Joe Bloggs, John Smith, John Smith"
Generato 20.
Ho quindi modificato leggermente la soluzione al seguente, che funziona per me:
Select (len(replace(Sales_Reps,' ',''))- len(replace((replace(Sales_Reps, ' ','')),'JohnSmith','')))/9 as Count_JS
Sono sicuro che qualcuno può pensare a un modo migliore per farlo!
Puoi anche provare questo
-- 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
Produzione:
La soluzione seguente aiuta a scoprire il numero di caratteri presenti da una stringa con una limitazione:
1) utilizzando SELECT LEN (REPLACE (myColumn, 'N', '')), ma limitazione e output errato nelle condizioni seguenti:
SELECT LEN (REPLACE ('YYNYNYYNNNYYNY', 'N', ''));
--8 - CorrettoSELEZIONA LUNGHEZZA (REPLACE ('123a123a12', 'a', ''));
--8 - SbagliatoSELEZIONA LUNGHEZZA (SOSTITUISCI ('123a123a12', '1', ''));
--7 - Sbagliato
2) Prova con la soluzione seguente per un output corretto:
seleziona dbo.vj_count_char_from_string ('123a123a12', '2');
--2 - Correttoseleziona dbo.vj_count_char_from_string ('123a123a12', 'a');
--2 - Corretto
-- ================================================
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
Se è necessario contare il carattere in una stringa con più di 2 tipi di caratteri, è possibile utilizzare al posto di 'n' -
alcuni operatori o regex dei caratteri accettare il carattere necessario.
SELECT LEN(REPLACE(col, 'N', ''))
Ecco cosa ho usato in Oracle SQL per vedere se qualcuno stava passando un numero di telefono formattato correttamente:
WHERE REPLACE(TRANSLATE('555-555-1212','0123456789-','00000000000'),'0','') IS NULL AND
LENGTH(REPLACE(TRANSLATE('555-555-1212','0123456789','0000000000'),'0','')) = 2
La prima parte controlla se il numero di telefono ha solo numeri e il trattino e la seconda parte controlla che il numero di telefono abbia solo due trattini.
ad esempio per calcolare il conteggio delle istanze del carattere (a) nella colonna SQL -> nome è il nome della colonna '' (e in doblequote è vuoto sostituisco a con nocharecter @ '')
selezionare len (nome) - len (sostituire (nome, 'a', '')) da TEST
seleziona len ('YYNYNYYNNNYYNY') - len (sostituisci ('YYNYNYYNNNYYNY', 'y', ''))