Cara menghitung contoh karakter di Kolom SQL

111

Saya memiliki kolom sql yang merupakan string 100 karakter 'Y' atau 'N'. Sebagai contoh:

YYNYNYYNNNYYNY ...

Apa cara termudah untuk menghitung semua simbol 'Y' di setiap baris.

cindi
sumber
1
Bisakah Anda menentukan platformnya? MySQL, MSSQl, Oracle?
Vincent Ramdhanie
Ya - dengan Oracle tampaknya Anda membutuhkan panjang - bukan len
JGFMK

Jawaban:

96

Di SQL Server:

SELECT LEN(REPLACE(myColumn, 'N', '')) 
FROM ...
David Hedlund
sumber
18
Perlu diketahui bahwa jika ada lebih dari "N" atau "Y" dalam string maka ini mungkin tidak akurat. Lihat solusi nickf untuk metode yang lebih kuat.
Tom H
319

Cuplikan ini berfungsi dalam situasi tertentu di mana Anda memiliki boolean: cuplikan ini menjawab "berapa banyak non-N yang ada?".

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

Jika, dalam situasi yang berbeda, Anda benar-benar mencoba menghitung kemunculan karakter tertentu (misalnya 'Y') dalam string apa pun, gunakan ini:

SELECT LEN(col) - LEN(REPLACE(col, 'Y', ''))
nickf
sumber
32
Yang kedua adalah jawaban terbaik di sini. Sisanya bergantung pada situasi aneh dari string yang hanya berisi dua karakter berbeda.
Steve Bennett
5
Sekadar catatan: di T-SQL, Anda harus menggunakan LEN daripada LENGTH.
Lukas
4
@nickf SQL fungsi len memangkas spasi di belakang jadi jika Anda mencari berapa banyak kemunculan spasi dalam string, katakan 'Halo' Anda akan mendapatkan 0. Cara termudah adalah dengan menambahkan karakter trailing ke string sebelumnya dan menyesuaikan len seperti begitu. SELECT LEN (col + '~') - LEN (REPLACE (col, 'Y', '') + '~')
domenicr
3
Jika Anda khawatir tentang spasi tambahan, gunakan fungsi DATALENGTH sebagai gantinya.
StevenWhite
2
@StevenWhite DATALENGTH mengembalikan jumlah byte yang digunakan. Jadi NVARCHAR akan digandakan.
domenicr
18

Ini memberi saya hasil yang akurat setiap kali ...

Ini ada di bidang Stripes saya ...

Kuning, Kuning, Kuning, Kuning, Kuning, Kuning, Hitam, Kuning, Kuning, Merah, Kuning, Kuning, Kuning, Hitam

  • 11 Kuning
  • 2 Hitam
  • 1 Merah
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red') 
  FROM t_Contacts
Ron Jual
sumber
Ini cara yang sangat cerdas! Terima kasih
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]
Aaron Dake
sumber
+1 Ini meningkatkan saran kedua oleh @nickf sehingga ini benar-benar akan memberi tahu Anda jumlah
kemunculan
Suntingan @ domenicr telah merusak jawaban ini dan suntingan saya ditolak. Pembagian harus berdasarkan LEN(@StringToFind).
Jamie Kitson
@jamiek maaf saya telah mengirimkan kode yang diperbaiki, tetapi tidak tahu mengapa suntingan Anda ditolak.
domenicr
@domenicr Anda harus kembali ke kode asli, suntingan Anda memperumit kode tanpa tujuan, @StringToFindtidak akan pernah kosong atau kosong.
Jamie Kitson
@Jamieon Saya melihat sebaliknya. Memeriksa pembagian dengan nol adalah prinsip praktik terbaik. Juga, menghitung jumlah ruang Field To Searchakan mendapatkan pembagian dengan nol karena Len(' ')mengembalikan nol.
domenicr
2

Mungkin sesuatu seperti ini ...

SELECT
    LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs
FROM
    SomeTable
Jason Punyon
sumber
1

Cara termudah adalah dengan menggunakan fungsi Oracle:

SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME
Mayuresh Bhabal
sumber
1

Ini akan mengembalikan jumlah kemunculan N

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

Faisal Shahzad
sumber
0

coba ini

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

Coba ini. Ini menentukan tidak. kemunculan karakter tunggal serta kejadian sub-string dalam string utama.

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);
Himanshu Tiwari
sumber
0

Jika Anda ingin menghitung jumlah instance string dengan lebih dari satu karakter, Anda dapat menggunakan solusi sebelumnya dengan regex, atau solusi ini menggunakan STRING_SPLIT, yang saya yakin telah diperkenalkan di SQL Server 2016. Anda juga memerlukan kompatibilitas level 130 dan lebih tinggi.

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
pengguna3469285
sumber
0

Jawaban kedua yang diberikan oleh nickf sangat pintar. Namun, ini hanya berfungsi untuk panjang karakter sub-string target 1 dan mengabaikan spasi. Secara khusus, ada dua spasi utama dalam data saya, yang dihapus SQL dengan membantu (saya tidak tahu ini) ketika semua karakter di sisi kanan dihapus. Artinya itu

" John Smith"

menghasilkan 12 menggunakan metode Nickf, sedangkan:

"Joe Bloggs, John Smith"

menghasilkan 10, dan

"Joe Bloggs, John Smith, John Smith"

Menghasilkan 20.

Oleh karena itu saya telah mengubah solusi sedikit menjadi berikut, yang berfungsi untuk saya:

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

Saya yakin seseorang dapat memikirkan cara yang lebih baik untuk melakukannya!

Analis statistik
sumber
0

Anda juga bisa Coba Ini

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

Keluaran:

masukkan deskripsi gambar di sini

atik sarker
sumber
0

Solusi di bawah ini membantu untuk mengetahui tidak ada karakter yang hadir dari string dengan batasan:

1) menggunakan SELECT LEN (REPLACE (myColumn, 'N', '')), tetapi batasan dan keluaran salah dalam kondisi di bawah ini:

PILIH LEN (REPLACE ('YYNYNYYNNNYYNY', 'N', ''));
--8 --Benar

PILIH LEN (REPLACE ('123a123a12', 'a', ''));
--8 --Salah

PILIH LEN (REPLACE ('123a123a12', '1', ''));
--7 --Salah

2) Coba dengan solusi di bawah ini untuk hasil yang benar:

  • Buat fungsi dan juga modifikasi sesuai kebutuhan.
  • Dan fungsi panggilan seperti di bawah ini

pilih dbo.vj_count_char_from_string ('123a123a12', '2');
--2 --Benar

pilih dbo.vj_count_char_from_string ('123a123a12', 'a');
--2 --Benar

-- ================================================
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
jainvikram444
sumber
0

Jika Anda perlu menghitung karakter dalam string dengan lebih dari 2 jenis karakter, Anda dapat menggunakan 'n' -beberapa operator atau regex karakter yang menerima karakter yang Anda butuhkan.

SELECT LEN(REPLACE(col, 'N', ''))
Saurabh Bhandari
sumber
-1

Inilah yang saya gunakan di Oracle SQL untuk melihat apakah seseorang memberikan nomor telepon yang diformat dengan benar:

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

Bagian pertama memeriksa untuk melihat apakah nomor telepon hanya memiliki nomor dan tanda hubung dan bagian kedua memeriksa untuk melihat bahwa nomor telepon hanya memiliki dua tanda hubung.

TonyK
sumber
Apa hubungannya pertanyaan ini dengan nomor telepon? Itu juga meminta solusi T-SQL ...
Ben
-1

misalnya untuk menghitung contoh hitungan karakter (a) di Kolom SQL -> nama adalah nama kolom '' (dan di doblequote kosong saya ganti a dengan nocharecter @ '')

pilih len (name) - len (replace (name, 'a', '')) dari TESTING

pilih len ('YYNYNYYNNNYYNY') - len (ganti ('YYNYNYYNNNYYNY', 'y', ''))

gady RajinikanthB
sumber