SQL列の文字のインスタンスをカウントする方法


111

100個の「Y」または「N」文字の文字列であるsql列があります。例えば:

YYNYNYYNNNYYNY ...

各行のすべての「Y」記号の数を取得する最も簡単な方法は何ですか。


1
プラットフォームを指定できますか?MySQL、MSSQl、Oracle?
Vincent Ramdhanie、2009

はい
-Oracleでは

回答:


96

SQL Serverの場合:

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

18
文字列に「N」または「Y」より多い場合、これは不正確になる可能性があることに注意してください。より堅牢な方法については、nickfのソリューションを参照してください。
トムH

319

このスニペットは、ブール値がある特定の状況で機能します。「N以外の数はいくつありますか?」と答えます。

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

別の状況で、特定の文字列内の特定の文字(たとえば、「Y」)の出現を実際にカウントしようとした場合は、次のようにします。

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

32
2番目は、ここでの最良の答えです。残りのすべては、2つの異なる文字のみを含む文字列の特異な状況に依存しています。
スティーブベネット

5
注:T-SQLでは、LENGTHではなくLENを使用する必要があります。
ルーク

4
@nickf SQL len関数は末尾のスペースを削除するので、文字列内のスペースの出現回数を探している場合、「Hello」とすると、0になります。最も簡単な方法は、前に文字列に末尾の文字を追加し、lenのように調整することです。そう。SELECT LEN(col + '〜')-LEN(REPLACE(col、 'Y'、 '')+ '〜')
domenicr

3
末尾のスペースが気になる場合は、代わりにDATALENGTH関数を使用してください。
StevenWhite 2015年

2
@StevenWhite DATALENGTHは、使用されたバイト数を返します。したがって、NVARCHARは2倍になります。
domenicr 2015年

18

これにより毎回正確な結果が得られました...

これは私のStripesフィールドにあります...

イエロー、イエロー、イエロー、イエロー、イエロー、イエロー、ブラック、イエロー、イエロー、レッド、イエロー、イエロー、イエロー、ブラック

  • 11イエロー
  • 2黒
  • 1赤
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red') 
  FROM t_Contacts

これはとても賢い方法です!ありがとう
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これにより、@ nickfによる2番目の提案が強化され、探している文字列が1文字を超える場合でも、実際に文字列のインスタンスの数が
わかり

@domenicrの編集によりこの回答は壊れ、私の編集は拒否されました。分割はである必要がありますLEN(@StringToFind)
Jamie Kitson、2015年

@jamiek謝罪訂正したコードを提出しましたが、編集が拒否された理由がわかりません。
domenicr 2015年

@domenicr元のコードに戻す必要があります。編集によってコードが複雑になり、目的がなくなり、@StringToFindnullまたは空になることはありません。
Jamie Kitson、2015年

@JamieKitson私はそうでなければ見る。ゼロによる除算をチェックすることは、ベストプラクティスの原則です。また、スペースの数をカウントField To SearchするとゼロがLen(' ')返されるため、ゼロで除算されます。
domenicr 2015年




0

これを試して

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

0

これを試して。いいえを決定します。単一文字の出現とメイン文字列のサブ文字列の出現

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

複数の文字を含む文字列のインスタンスの数をカウントする場合は、正規表現で以前のソリューションを使用するか、このソリューションでSTRING_SPLITを使用できます。これはSQL Server 2016で導入されたと思います。また、互換性が必要です。レベル130以上。

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

nickfが提供する2番目の答えは非常に賢いです。ただし、1のターゲットサブストリングの文字長に対してのみ機能し、スペースは無視されます。具体的には、データに2つの先行スペースがあり、SQLは右側のすべての文字が削除されたときに、これを有効に削除しました(これは知りませんでした)。つまり

" ジョンスミス"

Nickfの方法を使用して12を生成しましたが、

「ジョー・ブログ、ジョン・スミス」

生成された10、

「ジョー・ブログ、ジョン・スミス、ジョン・スミス」

生成された20。

したがって、私はソリューションを次のように少し変更しました。

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

きっと誰かがもっと良い方法を考えることができると思います!


0

これも試すことができます

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

出力:

ここに画像の説明を入力してください


0

以下の解決策は、制限付きの文字列から存在する文字を見つけるのに役立ちます:

1)SELECT LEN(REPLACE(myColumn、 'N'、 ''))を使用するが、以下の条件での制限と誤った出力:

SELECT LEN(REPLACE( 'YYNYNYYNNNYYNY'、 'N'、 ''));
--8-正しい

SELECT LEN(REPLACE( '123a123a12'、 'a'、 ''));
--8-誤り

SELECT LEN(REPLACE( '123a123a12'、 '1'、 ''));
--7-誤り

2)以下の解決策で正しい出力を試してください:

  • 関数を作成し、要件ごとに変更します。
  • そして、以下のように関数を呼び出します

dbo.vj_count_char_from_string( '123a123a12'、 '2');を選択します。
--2-正しい

dbo.vj_count_char_from_string( '123a123a12'、 'a');を選択します。
--2-正しい

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

2種類以上の文字を含む文字列内の文字をカウントする必要がある場合は、'n' -一部の演算子または正規表現の代わりに使用して、必要な文字を受け入れることができます。

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

-1

これは、誰かが正しい形式の電話番号を渡しているかどうかを確認するためにOracle SQLで使用したものです。

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

最初の部分では、電話番号に数字とハイフンのみが含まれているかどうかを確認し、2番目の部分では、電話番号に2つのハイフンのみが含まれているかどうかを確認します。


この質問は電話番号とどのような関係がありますか?T-SQLソリューションも求められています...
Ben

-1

たとえば、SQLの文字(a)のカウントインスタンスを計算するには列->名前は列名 ''(およびdoblequoteは空です、私はnocharecter @ ''で置き換えます)

テストからlen(name)-len(replace(name、 'a'、 ''))を選択します

select len( 'YYNYNYYNNNYYNY')-len(replace( 'YYNYNYYNNNYYNY'、 'y'、 ''))

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.