SQL 열에서 문자 인스턴스를 계산하는 방법


111

100 개의 'Y'또는 'N'자 문자열 인 SQL 열이 있습니다. 예를 들면 :

YYNYNYYNNNYYNY ...

각 행의 모든 ​​'Y'기호 수를 얻는 가장 쉬운 방법은 무엇입니까?


1
플랫폼을 지정할 수 있습니까? MySQL, MSSQl, Oracle?
Vincent Ramdhanie 2009

예-Oracle에서는 길이가 필요합니다
-len이 아님

답변:


96

SQL Server에서 :

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

18
문자열에 "N"또는 "Y"가 더 많은 경우 이는 정확하지 않을 수 있습니다. 보다 강력한 방법은 nickf의 솔루션을 참조하십시오.
Tom H

319

이 스 니펫은 부울이있는 특정 상황에서 작동합니다. "비 N이 몇 개입니까?"라고 대답합니다.

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

다른 상황에서 실제로 주어진 문자열에서 특정 문자 (예 : 'Y')의 발생 횟수를 계산하려는 경우 다음을 사용하십시오.

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

32
두 번째가 여기에서 가장 좋은 답변입니다. 나머지 모든 것은 두 개의 다른 문자 만 포함하는 문자열의 독특한 상황에 의존합니다.
Steve Bennett

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은 두 배가됩니다.
domenicr

18

이것은 매번 정확한 결과를주었습니다 ...

이것은 내 줄무늬 필드에 있습니다 ...

노란색, 노란색, 노란색, 노란색, 노란색, 노란색, 검은 색, 노란색, 노란색, 빨간색, 노란색, 노란색, 노란색, 검은 색

  • 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 이것은 실제로 당신에게 당신이 찾고있는 문자열이 1 개 이상의 문자 경우에도 문자열의 인스턴스의 수를 말할 것이다 너무 @nickf하여 두 번째 제안을 향상
케빈 Heidt가

@domenicr의 편집 으로이 답변이 깨졌고 편집이 거부되었습니다. 나눗셈은 LEN(@StringToFind).
Jamie Kitson

@jamiek 사과 수정 된 코드를 제출했지만 편집이 거부 된 이유를 모르겠습니다.
domenicr

@domenicr 원본 코드로 되돌려 야합니다. 편집 내용이 코드를 복잡하게 만들며 @StringToFindnull이나 비어 있지 않습니다.
Jamie Kitson 2015

@JamieKitson 나는 그렇지 않다. 0으로 나누기를 확인하는 것이 모범 사례의 원칙입니다. 또한 공백 수를 계산하면 Field To Search0을 Len(' ')반환 하므로 0으로 나눕니다.
domenicr

2

아마 이런 ...

SELECT
    LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs
FROM
    SomeTable

1

가장 쉬운 방법은 Oracle 기능을 사용하는 것입니다.

SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME

1

이것은 N의 발생 횟수를 반환합니다.

select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', '')) from Table


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

두 개 이상의 문자가있는 문자열의 인스턴스 수를 계산하려면 정규식과 함께 이전 솔루션을 사용하거나이 솔루션이 SQL Server 2016에 도입되었다고 생각하는 STRING_SPLIT를 사용합니다. 또한 호환성이 필요합니다. 레벨 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가 제공하는 두 번째 답변은 매우 영리합니다. 그러나 대상 하위 문자열 1의 문자 길이에 대해서만 작동하고 공백을 무시합니다. 특히 내 데이터에는 두 개의 선행 공백이 있었는데, 오른쪽의 모든 문자가 제거되면 SQL이 유용하게 제거합니다 (이는 몰랐습니다). 그 의미

" 존 스미스"

Nickf의 방법을 사용하여 12를 생성 한 반면 :

"Joe Bloggs, John Smith"

10을 생성하고

"Joe Bloggs, John Smith, John Smith"

생성 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) 올바른 출력을 위해 아래 솔루션을 시도하십시오.

  • 함수를 만들고 요구 사항에 따라 수정하십시오.
  • 그리고 아래에 따라 호출 기능

select dbo.vj_count_char_from_string ( '123a123a12', '2');
--2-정답

select 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

첫 번째 부분은 전화 번호에 숫자와 하이픈 만 있는지 확인하고 두 번째 부분은 전화 번호에 두 개의 하이픈 만 있는지 확인합니다.


이 질문은 전화 번호와 어떤 관련이 있습니까? 또한 T-SQL 솔루션을 요구하고 있습니다 ...
Ben

-1

예를 들어 SQL 열에서 (a) 문자의 인스턴스 수를 계산하려면-> 이름은 열 이름입니다 ''(그리고 doblequote에서 비어 있습니다. a를 nocharecter @ ''로 바꿉니다)

TESTING에서 len (name)-len (replace (name, 'a', '')) 선택

선택 len ( 'YYNYNYYNNNYYNY')-len (replace ( 'YYNYNYYNNNYYNY', 'y', ''))

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.