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?
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?
Antworten:
In SQL Server:
SELECT LEN(REPLACE(myColumn, 'N', ''))
FROM ...
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', ''))
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
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
wird niemals null oder leer sein.
Field To Search
eine Division durch Null erhalten, da Len(' ')
Null zurückgegeben wird.
Vielleicht so etwas ...
SELECT
LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs
FROM
SomeTable
Der einfachste Weg ist die Verwendung der Oracle-Funktion:
SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME
Dies gibt die Anzahl der Vorkommen von N zurück
select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', ''))
from Table
Versuche dies
declare @v varchar(250) = 'test.a,1 ;hheuw-20;'
-- LF ;
select len(replace(@v,';','11'))-len(@v)
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);
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
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!
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:
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 - RichtigSELECT LEN (REPLACE ('123a123a12', 'a', ''));
--8 - FalschSELECT LEN (REPLACE ('123a123a12', '1', ''));
--7 - Falsch
2) Versuchen Sie es mit der folgenden Lösung für die korrekte Ausgabe:
Wählen Sie dbo.vj_count_char_from_string ('123a123a12', '2').
--2 - RichtigWä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
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', ''))
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.
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', ''))