Cách đếm các trường hợp ký tự trong cột SQL


111

Tôi có một cột sql là một chuỗi gồm 100 ký tự 'Y' hoặc 'N'. Ví dụ:

YYNYNYYNNNYYNY ...

Cách dễ nhất để có được số lượng tất cả các ký hiệu 'Y' trong mỗi hàng là gì.


1
Bạn có thể chỉ định nền tảng? MySQL, MSSQl, Oracle?
Vincent Ramdhanie

Có - với Oracle có vẻ như bạn cần chiều dài - không len
JGFMK

Câu trả lời:


96

Trong SQL Server:

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

18
Chỉ cần lưu ý rằng nếu có nhiều hơn "N" hoặc "Y" trong chuỗi thì điều này có thể không chính xác. Xem giải pháp của nickf để có phương pháp mạnh mẽ hơn.
Tom H

319

Đoạn mã này hoạt động trong tình huống cụ thể mà bạn có boolean: nó trả lời "có bao nhiêu ký tự không phải N?".

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

Nếu, trong một tình huống khác, bạn thực sự đang cố gắng đếm số lần xuất hiện của một ký tự nhất định (ví dụ: 'Y') trong bất kỳ chuỗi nhất định nào, hãy sử dụng điều này:

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

32
Câu thứ hai là câu trả lời tốt nhất ở đây. Tất cả phần còn lại dựa vào tình huống đặc biệt của chuỗi chỉ chứa hai ký tự khác nhau.
Steve Bennett

5
Chỉ cần lưu ý: trong T-SQL, bạn sẽ cần sử dụng LEN thay vì LENGTH.
Luke

4
@nickf Hàm SQL len cắt bớt khoảng trắng, vì vậy nếu bạn đang tìm kiếm bao nhiêu lần xuất hiện của khoảng trắng trong một chuỗi, hãy nói 'Xin chào', bạn sẽ nhận được 0. Cách dễ nhất là thêm một ký tự dấu vào chuỗi trước đó và điều chỉnh len như thế nào vì thế. CHỌN LEN (col + '~') - LEN (REPLACE (col, 'Y', '') + '~')
domenicr

3
Nếu bạn lo lắng về dấu cách ở cuối, hãy sử dụng hàm DATALENGTH để thay thế.
StevenWhite

2
@StevenWhite DATALENGTH trả về số byte được sử dụng. Vì vậy NVARCHAR sẽ được nhân đôi.
domenicr

18

Điều này đã cho tôi kết quả chính xác mỗi khi ...

Đây là trong trường Stripes của tôi ...

Vàng, Vàng, Vàng, Vàng, Vàng, Vàng, Vàng, Đen, Vàng, Vàng, Đỏ, Vàng, Vàng, Vàng, Đen

  • 11 màu vàng
  • 2 màu đen
  • 1 màu đỏ
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red') 
  FROM t_Contacts

Đây là một cách rất thông minh! Cảm ơn bạn
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 này tăng cường các đề nghị thứ hai bởi @nickf để nó sẽ thực sự cho bạn biết số lượng các trường hợp của một chuỗi thậm chí nếu chuỗi bạn đang muốn tìm nhiều hơn 1 nhân vật
Kevin Heidt

Chỉnh sửa của @ domenicr đã phá vỡ câu trả lời này và chỉnh sửa của tôi đã bị từ chối. Sự phân chia nên được bởi LEN(@StringToFind).
Jamie Kitson

@jamiek xin lỗi Tôi đã gửi mã đã sửa, nhưng không biết tại sao chỉnh sửa của bạn bị từ chối.
domenicr

@domenicr Bạn nên hoàn nguyên về mã ban đầu, chỉnh sửa của bạn làm phức tạp mã không có mục đích gì, @StringToFindsẽ không bao giờ trống hoặc rỗng.
Jamie Kitson

@JamieKitson Tôi thấy khác. Kiểm tra phép chia cho số 0 là một nguyên tắc thực hành tốt nhất. Ngoài ra, đếm số khoảng trắng trong Field To Searchsẽ nhận được phép chia cho 0 vì Len(' ')trả về 0.
domenicr

2

Có thể như thế này ...

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

1

Cách dễ nhất là sử dụng hàm Oracle:

SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME

1

Điều này sẽ trả về số lần xuất hiện của N

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


0

thử cái này

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

0

Thử cái này. Nó xác định không. các lần xuất hiện ký tự đơn cũng như các lần xuất hiện chuỗi phụ trong chuỗi chính.

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

Nếu bạn muốn đếm số phiên bản của chuỗi có nhiều hơn một ký tự, bạn có thể sử dụng giải pháp trước đó với regex hoặc giải pháp này sử dụng STRING_SPLIT, mà tôi tin rằng đã được giới thiệu trong SQL Server 2016. Ngoài ra, bạn sẽ cần khả năng tương thích cấp 130 trở lên.

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

Câu trả lời thứ hai do nickf cung cấp rất thông minh. Tuy nhiên, nó chỉ hoạt động với độ dài ký tự của chuỗi con mục tiêu là 1 và bỏ qua khoảng trắng. Cụ thể, có hai khoảng trắng ở đầu trong dữ liệu của tôi, mà SQL sẽ loại bỏ một cách hữu ích (tôi không biết điều này) khi tất cả các ký tự ở phía bên tay phải bị xóa. Điều đó có nghĩa là

" John Smith"

đã tạo 12 bằng phương pháp của Nickf, trong khi:

"Joe Bloggs, John Smith"

đã tạo 10 và

"Joe Bloggs, John Smith, John Smith"

Đã tạo 20.

Do đó, tôi đã sửa đổi giải pháp một chút thành như sau, phù hợp với tôi:

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

Tôi chắc rằng ai đó có thể nghĩ ra cách tốt hơn để làm điều đó!


0

Bạn cũng có thể thử cái này

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

Đầu ra:

nhập mô tả hình ảnh ở đây


0

Giải pháp dưới đây giúp tìm ra không có ký tự nào hiện diện từ một chuỗi có giới hạn:

1) sử dụng SELECT LEN (REPLACE (myColumn, 'N', '')), nhưng giới hạn và đầu ra sai trong điều kiện dưới đây:

SELECT LEN (REPLACE ('YYNYNYYNNNYYNY', 'N', ''));
--8 - Chính xác

SELECT LEN (REPLACE ('123a123a12', 'a', ''));
--8 - Sai

SELECT LEN (REPLACE ('123a123a12', '1', ''));
--7 - Sai

2) Hãy thử với giải pháp dưới đây để có đầu ra chính xác:

  • Tạo một chức năng và cũng có thể sửa đổi theo yêu cầu.
  • Và gọi hàm như bên dưới

select dbo.vj_count_char_from_string ('123a123a12', '2');
--2 - Chính xác

select dbo.vj_count_char_from_string ('123a123a12', 'a');
--2 - Chính xác

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

Nếu bạn cần đếm các ký tự trong một chuỗi có nhiều hơn 2 loại ký tự, bạn có thể sử dụng thay vì 'n' -một số toán tử hoặc regex của các ký tự chấp nhận các ký tự bạn cần.

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

-1

Đây là những gì tôi đã sử dụng trong Oracle SQL để xem liệu ai đó đang chuyển một số điện thoại được định dạng chính xác:

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

Phần đầu tiên kiểm tra xem số điện thoại chỉ có các chữ số và dấu gạch nối và phần thứ hai kiểm tra xem số điện thoại chỉ có hai dấu gạch nối.


Câu hỏi này liên quan gì đến số điện thoại? Nó cũng yêu cầu một giải pháp T-SQL ...
Ben

-1

ví dụ để tính số lần đếm của ký tự (a) trong SQL Column -> tên là tên cột '' (và trong doblequote là trống, tôi sẽ thay thế a bằng nocharecter @ '')

select len ​​(name) - len (Replace (name, 'a', '')) từ KIỂM TRA

select len ​​('YYNYNYYNNNYYNY') - len (Replace ('YYNYNYYNNNYYNY', 'y', ''))

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.