วิธีนับอินสแตนซ์ของอักขระในคอลัมน์ SQL


111

ฉันมีคอลัมน์ sql ที่เป็นสตริงอักขระ 100 'Y' หรือ 'N' ตัวอย่างเช่น:

ปปปปปปปปปป ...

วิธีใดเป็นวิธีที่ง่ายที่สุดในการนับสัญลักษณ์ 'Y' ทั้งหมดในแต่ละแถว


1
ระบุแพลตฟอร์มได้ไหม MySQL, MSSQl, Oracle?
Vincent Ramdhanie

ใช่ - ด้วย Oracle ดูเหมือนว่าคุณต้องการความยาว - ไม่ใช่ len
JGFMK

คำตอบ:


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 คุณจะต้องใช้ LEN มากกว่า LENGTH
ลุค

4
@nickf ฟังก์ชัน SQL len จะตัดช่องว่างต่อท้ายดังนั้นหากคุณกำลังมองหาจำนวนครั้งที่เกิดขึ้นของช่องว่างภายในสตริงสมมติว่า 'สวัสดี' คุณจะได้ 0 วิธีที่ง่ายที่สุดคือเพิ่มอักขระต่อท้ายในสตริงก่อนและปรับ len เช่น ดังนั้น. เลือก LEN (col + '~') - LEN (REPLACE (col, 'Y', '') + '~')
domenicr

3
หากคุณกังวลเกี่ยวกับการเว้นวรรคต่อท้ายให้ใช้ฟังก์ชัน DATALENGTH แทน
StevenWhite

2
@StevenWhite DATALENGTH ส่งคืนจำนวนไบต์ที่ใช้ ดังนั้น NVARCHAR จะเพิ่มขึ้นเป็นสองเท่า
domenicr

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 เพื่อที่จะบอกจำนวนอินสแตนซ์ของสตริงแม้ว่าสตริงที่คุณกำลังมองหาจะมีมากกว่า 1 อักขระก็ตาม
Kevin Heidt

การแก้ไขของ @domenicr ทำให้คำตอบนี้ไม่สมบูรณ์และการแก้ไขของฉันถูกปฏิเสธ LEN(@StringToFind)ส่วนที่ควรจะเป็นโดย
Jamie Kitson

@jamiek ขออภัยฉันได้ส่งรหัสที่แก้ไขแล้ว แต่ไม่รู้ว่าเหตุใดการแก้ไขของคุณจึงถูกปฏิเสธ
domenicr

@domenicr คุณควรเปลี่ยนกลับไปใช้โค้ดเดิมการแก้ไขของคุณทำให้โค้ดซับซ้อนจนไม่มีจุดประสงค์@StringToFindจะไม่มีวันว่างหรือว่างเปล่า
Jamie Kitson

@JamieKitson ฉันเห็นเป็นอย่างอื่น การตรวจสอบการหารด้วยศูนย์เป็นหลักการปฏิบัติที่ดีที่สุด นอกจากนี้การนับจำนวนช่องว่างในField To Searchจะทำให้หารด้วยศูนย์เนื่องจากLen(' ')ส่งคืนศูนย์
domenicr



1

สิ่งนี้จะส่งกลับจำนวนการเกิดขึ้นของ N

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



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

หากคุณต้องการนับจำนวนอินสแตนซ์ของสตริงที่มีอักขระมากกว่าหนึ่งตัวคุณสามารถใช้โซลูชันก่อนหน้ากับ regex หรือโซลูชันนี้ใช้ 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 ฉลาดมาก อย่างไรก็ตามใช้ได้เฉพาะกับความยาวอักขระของสตริงย่อยเป้าหมายที่ 1 และละเว้นช่องว่าง โดยเฉพาะอย่างยิ่งมีช่องว่างสองช่องในข้อมูลของฉันซึ่ง SQL จะลบออกอย่างเป็นประโยชน์ (ฉันไม่ทราบเรื่องนี้) เมื่ออักขระทั้งหมดทางด้านขวามือถูกลบออก ซึ่งหมายความว่า

" จอห์นสมิ ธ"

สร้างขึ้น 12 ครั้งโดยใช้วิธีของ Nickf ในขณะที่:

"โจบล็อกส์จอห์นสมิ ธ "

สร้าง 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', '')) แต่ข้อ จำกัด และผลลัพธ์ที่ไม่ถูกต้องในเงื่อนไขด้านล่าง:

เลือก LEN (REPLACE ('YYNYNYYNNNYYNY', 'N', ''));
--8 - ถูกต้อง

เลือก LEN (REPLACE ('123a123a12', 'a', ''));
--8 - ผิด

เลือก 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

ส่วนแรกตรวจสอบว่าหมายเลขโทรศัพท์มีเพียงตัวเลขหรือไม่และขีดกลางและส่วนที่สองจะตรวจสอบว่าหมายเลขโทรศัพท์มีขีดกลางเพียงสองตัว


คำถามนี้เกี่ยวข้องกับหมายเลขโทรศัพท์อย่างไร? ยังขอโซลูชัน T-SQL ...
Ben

-1

ตัวอย่างเช่นในการคำนวณจำนวนอินสแตนซ์ของอักขระ (a) ในคอลัมน์ SQL -> ชื่อคือชื่อคอลัมน์ '' (และใน doblequote ว่างเปล่าฉันแทนที่ a ด้วย nocharecter @ '')

เลือก len (name) - len (แทนที่ (name, 'a', '')) จาก TESTING

เลือก len ('YYNYNYYNNNYYNY') - len (แทนที่ ('YYNYNYYNNNYYNY', 'y', ''))

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.