SQL कॉलम में वर्ण के उदाहरणों की गणना कैसे करें


111

मेरे पास एक sql कॉलम है जो 100 'Y' या 'N' अक्षर का एक स्ट्रिंग है। उदाहरण के लिए:

YYNYNYYNNNYYNY ...

प्रत्येक पंक्ति में सभी 'वाई' प्रतीकों की गिनती प्राप्त करने का सबसे आसान तरीका क्या है।


1
क्या आप मंच निर्दिष्ट कर सकते हैं? MySQL, MSSQl, Oracle?
विंसेंट रामधनी 14

हां - ओरेकल के साथ ऐसा लगता है कि आपको लंबाई की आवश्यकता है - लेन नहीं
JGFMK

जवाबों:


96

SQL सर्वर में:

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

18
बस ध्यान रखें कि यदि स्ट्रिंग में "एन" या "वाई" से अधिक हैं तो यह गलत हो सकता है। अधिक मजबूत विधि के लिए nickf के समाधान देखें।
टॉम एच

319

यह स्निपेट उस विशिष्ट स्थिति में काम करता है जहां आपके पास बूलियन है: यह उत्तर देता है "कितने गैर-एनएस हैं?"।

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

यदि, एक अलग स्थिति में, आप वास्तव में किसी भी दिए गए स्ट्रिंग में एक निश्चित चरित्र (उदाहरण के लिए 'Y') की घटनाओं को गिनने की कोशिश कर रहे थे, तो इसका उपयोग करें:

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

32
दूसरा सबसे अच्छा जवाब यहाँ है। बाकी सभी केवल दो अलग-अलग वर्णों वाली स्ट्रिंग की अजीब स्थिति पर निर्भर करते हैं।
स्टीव बेनेट

5
बस एक नोट: टी-एसक्यूएल में, आपको LENGTH के बजाय LEN का उपयोग करना होगा।
ल्यूक

4
@nickf SQL लेन फंक्शन ट्रेलिंग स्पेस को ट्रिम कर देता है, इसलिए अगर आप देख रहे थे कि स्ट्रिंग के भीतर स्पेस की कितनी घटनाएँ हैं, तो आइए 'हैलो' कहते हैं कि आपको 0. सबसे आसान तरीका मिलेगा, स्ट्रिंग से पहले एक ट्रेलिंग कैरेक्टर जोड़ना और उसे एडजस्ट करना इसलिए। SELEN LEN (col + '~') - LEN (REPLACE (कॉल, 'Y', '') + '~')
domenicr

3
यदि आप रिक्त स्थान के बारे में चिंतित हैं, तो इसके बजाय DATALENGTH फ़ंक्शन का उपयोग करें।
स्टीवन व्हाईट 17

2
@StevenWhite DATALENGTH उपयोग किए गए बाइट्स की संख्या देता है। तो NVARCHAR दोगुना हो जाएगा।
20-30 बजे डोमिनिक

18

इससे मुझे हर बार सटीक परिणाम मिले ...

यह मेरी धारियों के क्षेत्र में है ...

पीला, पीला, पीला, पीला, पीला, पीला, काला, पीला, पीला, लाल, पीला, पीला, पीला, काला

  • 11 येलो
  • २ काला
  • 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 से अधिक वर्ण हो
केविन हेयट

@ domenicr के संपादन ने इस उत्तर को तोड़ दिया है और मेरा संपादन अस्वीकार कर दिया गया है। प्रभाग द्वारा किया जाना चाहिए LEN(@StringToFind)
जेमी किट्सन

@jamiek माफी मैंने सही कोड प्रस्तुत किया है, लेकिन पता नहीं क्यों आपके संपादन को अस्वीकार कर दिया गया था।
domenicr

@domenicr आपको मूल कोड पर वापस लौटना चाहिए, आपका संपादन बिना किसी उद्देश्य के कोड को जटिल बनाता है, @StringToFindकभी भी शून्य या खाली नहीं होने वाला है।
जेमी किट्सन

@JamieKitson मैं अन्यथा देखता हूं। शून्य द्वारा विभाजन की जाँच करना सर्वोत्तम प्रथाओं का एक सिद्धांत है। इसके अलावा, रिक्त स्थान की संख्या गिनने पर Field To Searchशून्य से एक विभाजन प्राप्त होगा क्योंकि Len(' ')शून्य लौटता है।
डोमिनिक




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

यदि आप एक से अधिक वर्णों के साथ आवृत्तियों की संख्या की गणना करना चाहते हैं, तो आप या तो 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

निकफ द्वारा प्रदान किया गया दूसरा उत्तर बहुत चालाक है। हालाँकि, यह केवल 1 के लक्ष्य उप-स्ट्रिंग की वर्ण लंबाई के लिए काम करता है और रिक्त स्थान को अनदेखा करता है। विशेष रूप से, मेरे डेटा में दो प्रमुख स्थान थे, जिसे एसक्यूएल मदद से हटाता है (मुझे यह नहीं पता था) जब दाहिने हाथ के सभी वर्ण हटा दिए जाते हैं। जिसका मतलब था

" जॉन स्मिथ"

निकफ की विधि का उपयोग करते हुए 12 उत्पन्न, जबकि:

"जो ब्लॉग्स, जॉन स्मिथ"

उत्पन्न 10, और

"जो ब्लॉग्स, जॉन स्मिथ, जॉन स्मिथ"

उत्पन्न २०।

इसलिए मैंने समाधान को निम्नलिखित में थोड़ा संशोधित किया है, जो मेरे लिए काम करता है:

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) SELEN LEN (REPLACE (myColumn, 'N', '')) का उपयोग करके, लेकिन नीचे की स्थिति में सीमा और गलत आउटपुट:

SELEN LEN (REPLACE ('YYNYNYYNNNYYNY', 'N', ''));
--8 - सही

SELEN LEN (REPLACE ('123a123a12', 'a', ''));
--8 - वृंद

SELEN 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

यहाँ मैंने ओरेकल एसक्यूएल में उपयोग किया है कि क्या कोई सही ढंग से स्वरूपित फोन नंबर दे रहा है या नहीं:

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

पहला भाग यह देखने के लिए जाँचता है कि क्या फ़ोन नंबर में केवल नंबर और हाइफ़न हैं और दूसरे भाग में यह देखने के लिए जाँच करता है कि फ़ोन नंबर में केवल दो हाइफ़न हैं।


इस सवाल का फोन नंबरों से क्या लेना-देना है? यह टी-एसक्यूएल समाधान के लिए भी पूछ रहा है ...
बेन

-1

उदाहरण के लिए एसक्यूएल कॉलम में चरित्र (ए) के उदाहरणों की गणना करने के लिए -> नाम कॉलम नाम है '' (और doblequote में खाली है मैं nocharecter @ '' के साथ बदल रहा हूं)

TESTING से len (नाम) - len (प्रतिस्थापित (नाम, 'a', '')) चुनें

चुनें लेन ('YYNYNYYNNNYYNY') - len (बदलें ('YYNYNYYNNYYYY', 'y', ''))

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.