SQL Sütununda karakter örnekleri nasıl hesaplanır


111

100 'Y' veya 'N' karakterli bir sql sütunum var. Örneğin:

YYNYNYNNYYNY ...

Her satırdaki tüm 'Y' sembollerinin sayısını almanın en kolay yolu nedir?


1
Platformu belirtebilir misiniz? MySQL, MSSQl, Oracle?
Vincent Ramdhanie

Evet - Oracle ile uzunluğa ihtiyacınız var gibi görünüyor - len değil
JGFMK

Yanıtlar:


96

SQL Server'da:

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

18
Dizede "N" veya "Y" den daha fazla varsa, bu yanlış olabilir. Daha sağlam bir yöntem için nickf'in çözümüne bakın.
Tom H

319

Bu pasaj, bir boole değerinizin olduğu özel durumda çalışır: "Kaç tane N olmayan var?" Yanıtını verir.

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

Farklı bir durumda, herhangi bir dizede belirli bir karakterin (örneğin 'Y') oluşumlarını gerçekten saymaya çalışıyorsanız, şunu kullanın:

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

32
İkincisi, buradaki en iyi cevap. Geri kalan her şey, yalnızca iki farklı karakter içeren dizenin kendine özgü durumuna güveniyor.
Steve Bennett

5
Sadece bir not: T-SQL'de LENGTH yerine LEN kullanmanız gerekir.
Luke

4
@nickf SQL len işlevi sondaki boşlukları kırpar, bu nedenle bir dizge içinde bir boşluğun kaç kez geçtiğini arıyor olsaydınız, 'Merhaba' diyelim 0 elde edersiniz. En kolay yol, dizeye sondan bir karakter eklemek ve uzunluğu gibi yani. UZUNLUK SEÇİN (sütun + '~') - UZUNLUK (DEĞİŞTİR (sütun, 'Y', '') + '~')
domenicr

3
Sondaki boşluklarla ilgileniyorsanız, bunun yerine DATALENGTH işlevini kullanın.
StevenWhite

2
@StevenWhite DATALENGTH, kullanılan bayt sayısını döndürür. Böylece NVARCHAR ikiye katlanacak.
domenicr

18

Bu bana her seferinde doğru sonuçlar verdi ...

Bu benim Stripes alanımda ...

Sarı, Sarı, Sarı, Sarı, Sarı, Sarı, Siyah, Sarı, Sarı, Kırmızı, Sarı, Sarı, Sarı, Siyah

  • 11 Sarı
  • 2 Siyah
  • 1 Kırmızı
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red') 
  FROM t_Contacts

Bu çok akıllıca bir yol! Teşekkürler
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 Bu, ikinci öneriyi @ nickf ile geliştirir, böylece aradığınız dize 1 karakterden fazla olsa bile size bir dizenin örnek sayısını gerçekten söyler
Kevin Heidt

@ domenicr'in düzenlemesi bu cevabı bozdu ve düzenlemem reddedildi. Bölme olmalıdır LEN(@StringToFind).
Jamie Kitson

@jamiek özür dilerim, düzeltilmiş kod gönderdim, ancak düzenlemenizin neden reddedildiğini bilmiyorum.
domenicr

@domenicr Orijinal koda geri dönmelisiniz, düzenlemeniz kodu hiçbir amaç için karmaşıklaştırır @StringToFind, asla boş veya boş olmayacaktır.
Jamie Kitson

@JamieKitson Ben aksini görüyorum. Sıfıra bölme olup olmadığını kontrol etmek, en iyi uygulamalar ilkesidir. Ayrıca, içindeki boşlukların sayılması, Field To Searchsıfıra bölündüğü için sıfıra Len(' ')bölünür.
domenicr

2

Belki bunun gibi bir şey ...

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

1

En kolay yol, Oracle işlevini kullanmaktır:

SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME

1

Bu, N'nin oluşum sayısını döndürecektir

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


0

bunu dene

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

0

Bunu dene. Hayır belirler. tek karakter oluşumlarının yanı sıra ana dizedeki alt dize oluşumlarının.

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

Birden fazla karakter içeren dizelerin örnek sayısını saymak istiyorsanız, ya önceki çözümü regex ile kullanabilirsiniz ya da bu çözüm, SQL Server 2016'da tanıtıldığına inandığım STRING_SPLIT'i kullanır. Ayrıca uyumluluğa ihtiyacınız olacak. seviye 130 ve üstü.

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'in verdiği ikinci cevap çok akıllıca. Ancak, yalnızca 1 hedef alt dizesinin bir karakter uzunluğu için çalışır ve boşlukları yok sayar. Spesifik olarak, verilerimde önde gelen iki boşluk vardı ve sağ taraftaki tüm karakterler silindiğinde SQL'in yardımcı bir şekilde kaldırdığı (bunu bilmiyordum). Bunun anlamı

" John Smith"

Nickf'in yöntemini kullanarak 12 üretti, oysa:

"Joe Bloggs, John Smith"

10 oluşturuldu ve

"Joe Bloggs, John Smith, John Smith"

20 oluşturuldu.

Bu nedenle çözümü, benim için çalışan aşağıdaki şekilde biraz değiştirdim:

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

Eminim birisi bunu yapmanın daha iyi bir yolunu düşünebilir!


0

Bunu da deneyebilirsiniz

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

Çıktı:

görüntü açıklamasını buraya girin


0

Aşağıdaki çözüm, sınırlama ile bir dizede bulunan karakter olmadığını bulmaya yardımcı olur:

1) UZUNLUK SEÇİN (DEĞİŞTİR (myColumn, 'N', '')), ancak aşağıdaki koşulda sınırlama ve yanlış çıktı kullanma:

UZUNLUK SEÇİN (DEĞİŞTİR ('YYNYYNNYYNY', 'N', ''));
--8 --Doğru

UZUNLUK SEÇİN (DEĞİŞTİR ('123a123a12', 'a', ''));
--8 - Yanlış

UZUNLUK SEÇİN (DEĞİŞTİR ('123a123a12', '1', ''));
--7 - Yanlış

2) Doğru çıktı için aşağıdaki çözümü deneyin:

  • Bir işlev oluşturun ve ihtiyaca göre değiştirin.
  • Ve aşağıdaki gibi çağrı işlevi

dbo.vj_count_char_from_string ('123a123a12', '2') seçin;
--2 --Doğru

dbo.vj_count_char_from_string ('123a123a12', 'a') seçin;
--2 --Doğru

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

Eğer bir karakter dizisinde 2'den fazla karakter içeren bir karakter saymanız gerekiyorsa, 'n' -bazı operatörlerin yerine kullanabilirsiniz veya karakterlerin normal ifadeleri ihtiyacınız olan karakterleri kabul eder.

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

-1

Oracle SQL'de birinin doğru biçimlendirilmiş bir telefon numarasını geçirip geçirmediğini görmek için kullandığım şey:

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

İlk bölüm, telefon numarasında yalnızca numara olup olmadığını ve kısa çizginin olup olmadığını kontrol eder ve ikinci bölüm, telefon numarasında yalnızca iki kısa çizgi olup olmadığını kontrol eder.


Bu sorunun telefon numaralarıyla ne ilgisi var? Ayrıca bir T-SQL çözümü istiyor ...
Ben

-1

örneğin, SQL Sütunundaki (a) karakterinin sayım örneklerini hesaplamak için -> isim sütun adıdır '' (ve doblequote'da boşken a'yı nocharecter @ '' ile değiştiriyorum)

TESTING'den len (ad) - len ((ad, 'a', '') yerine) seçin

len seçin ('YYNYNYYNNYYNY') - len (('YYNYYNNNYYNY', 'y', ''))

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.