दिलचस्प पोस्ट
जावास्क्रिप्ट में टाइप बेशर क्या है? एक सामान्य प्रकार के रूप में सामान्य प्रोटोकॉल का उपयोग कैसे करें मैं स्पार्क स्ट्रीमिंग में एक प्रसारण चर को कैसे अपडेट कर सकता हूं? IE11 में createObjectURL द्वारा बनाए गए ओपन लिंक्स दस्तावेज़ के बीच अंतर। फ़्रेड एंड फ़ंक्शन सी ++ थ्रेड पूल क्या कोई ओवरराइड पद्धति के मूल संस्करण को कॉल करने का कोई तरीका है? (सी # .NET) कैसे एक JSON फ़ाइल को प्रिंट करने के लिए? "मेमोरी से बाहर" एक पुनर्प्राप्ति योग्य त्रुटि है? <Jsp: include page = …> और <% @ के बीच अंतर क्या है file = …>? iPhone में "निकास कोड 1 के साथ कमांड / बिन / श असफल" को कैसे ठीक करें कैसे System.String करने के लिए SecureString कन्वर्ट करने के लिए? इकाई संरचना द्वारा उत्पन्न एक कक्षा में डेटा एनोटेशन जोड़ें किसी सूत्र में वर्ण स्ट्रिंग द्वारा संदर्भ चर का उपयोग कैसे करें? VBScript का उपयोग करके एक फ़ाइल को पढ़ें और लिखें

एसक्यूएल varchar में एक निश्चित ऑब्जेक्ट की घटनाओं की संख्या कैसे गिनती है?

मेरे पास एक ऐसा कॉलम है जिसमें मान, जैसे ए, बी, सी, डी के स्वरूपित है। टी-एसक्यूएल में उस मूल्य में कॉमा की संख्या की गणना करने का कोई तरीका है?

Solutions Collecting From Web of "एसक्यूएल varchar में एक निश्चित ऑब्जेक्ट की घटनाओं की संख्या कैसे गिनती है?"

मन में आने वाला पहला तरीका यह है कि यह अल्पविराम को रिक्त स्ट्रिंग के साथ बदलकर और लंबाई की तुलना करके परोक्ष रूप से करे

Declare @string varchar(1000) Set @string = 'a,b,c,d' select len(@string) - len(replace(@string, ',', '')) 

सीएमएसजेआर के जवाब का त्वरित विस्तार जो अधिक से अधिक वर्णों के तार के लिए काम करता है।

 CREATE FUNCTION dbo.CountOccurancesOfString ( @searchString nvarchar(max), @searchTerm nvarchar(max) ) RETURNS INT AS BEGIN return (LEN(@searchString)-LEN(REPLACE(@searchString,@searchTerm,'')))/LEN(@searchTerm) END 

उपयोग:

 SELECT * FROM MyTable where dbo.CountOccurancesOfString(MyColumn, 'MyString') = 1 

आप उस स्ट्रिंग की लंबाई की तुलना कर सकते हैं जहां कोमा हटा दिया गया है:

 len(value) - len(replace(value,',','')) 

कुछ मामलों में @ सीएसएमजेआरआर के पास एक समस्या है

उनका जवाब यह था कि:

 Declare @string varchar(1000) Set @string = 'a,b,c,d' select len(@string) - len(replace(@string, ',', '')) 

यह अधिकांश परिदृश्यों में काम करता है, हालांकि, इसे चलाने का प्रयास करें:

 DECLARE @string VARCHAR(1000) SET @string = 'a,b,c,d ,' SELECT LEN(@string) - LEN(REPLACE(@string, ',', '')) 

किसी कारण के लिए, पुन: जगह अंतिम अल्पविराम से छुटकारा दिलाता है, लेकिन इससे पहले ही स्थान (यकीन नहीं क्यों) यह 5 के एक मूल्य के रूप में होता है जब आप अपेक्षा करते हैं 4. यह ऐसा करने का एक और तरीका है जो इस विशेष परिदृश्य में भी काम करेगा:

 DECLARE @string VARCHAR(1000) SET @string = 'a,b,c,d ,' SELECT LEN(REPLACE(@string, ',', '**')) - LEN(@string) 

ध्यान दें कि आपको तारों का उपयोग करने की आवश्यकता नहीं है कोई भी दो-चरणीय प्रतिस्थापन होगा। विचार यह है कि आप प्रत्येक चरित्र के प्रत्येक वर्ण के लिए स्ट्रिंग को लंबा कर रहे हैं, तो आप मूल की लंबाई घटाते हैं। यह मूल रूप से मूल उत्तर की विपरीत विधि है जो अजीब trimming पक्ष-प्रभाव के साथ नहीं आती है।

 Declare @string varchar(1000) DECLARE @SearchString varchar(100) Set @string = 'as as df df as as as' SET @SearchString = 'as' select ((len(@string) - len(replace(@string, @SearchString, ''))) -(len(@string) - len(replace(@string, @SearchString, ''))) % 2) / len(@SearchString) 

@ एंड्रयू के समाधान पर बिल्डिंग, आपको एक गैर-प्रक्रियात्मक तालिका-मूल्य-फ़ंक्शन और क्रॉस लागू करने से बेहतर प्रदर्शन प्राप्त होगा:

 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /* Usage: SELECT t.[YourColumn], c.StringCount FROM YourDatabase.dbo.YourTable t CROSS APPLY dbo.CountOccurrencesOfString('your search string', t.[YourColumn]) c */ CREATE FUNCTION [dbo].[CountOccurrencesOfString] ( @searchString nvarchar(max), @searchTerm nvarchar(max) ) RETURNS TABLE AS RETURN SELECT (DATALENGTH(@searchString)-DATALENGTH(REPLACE(@searchString,@searchTerm,'')))/NULLIF(DATALENGTH(@searchTerm), 0) AS StringCount 
 DECLARE @records varchar(400) SELECT @records = 'a,b,c,d' select LEN(@records) as 'Before removing Commas' , LEN(@records) - LEN(REPLACE(@records, ',', '')) 'After Removing Commans' 

Darrel Lee मुझे लगता है कि एक बहुत अच्छा जवाब है। PATINDEX() CHARINDEX() साथ CHARINDEX() को बदलें, और आप regex के साथ कुछ कमजोर regex खोज भी कर सकते हैं …

जैसे, कहते हैं कि आप इसका उपयोग @pattern लिए @pattern :

 set @pattern='%[-.|!,'+char(9)+']%' 

आप ऐसा कुछ पागल होना क्यों चाहते हैं?

मान लीजिए कि आप सीमांकित पाठ स्ट्रिंग को एक स्टेजिंग टेबल में लोड कर रहे हैं, जहां डेटा को पकड़े जाने वाले फ़ील्ड कुछ वर्चार (8000) या नवारचार (अधिकतम) जैसी है …

कभी-कभी ईटीएल (एक्स्ट्रेक्ट-ट्रांसफार्म-लोड) के बजाय ईएलटी (एक्स्ट्रेक्ट-लोड-ट्रांस्फार्म) डेटा को आसान / तेज़ करना, और ऐसा करने का एक तरीका सीमांकित रिकॉर्ड को लोड करना है- जैसा कि एक स्टेजिंग टेबल में है, खासकर यदि आप एक SSIS पैकेज के भाग के रूप में उनके साथ सौदा करने के बजाय असाधारण रिकॉर्ड देखने के लिए एक सरल तरीका चाहते हैं … लेकिन यह एक अलग थ्रेड के लिए एक पवित्र युद्ध है।

स्वीकृत उत्तर सही है, इसे 2 या अधिक वर्णों के लिए उप-स्ट्रिंग में इस्तेमाल करने के लिए विस्तारित किया गया है, हमें इसका जवाब देना चाहिए। अर्थात

 Declare @string varchar(1000) Set @string = 'aa,bb,cc,dd' Set @substring = 'aa' select (len(@string) - len(replace(@string, @substring, '')))/len(@substring) 

आप प्राप्त करने के लिए निम्न संग्रहित प्रक्रिया का उपयोग कर सकते हैं, मान

 IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_parsedata]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[sp_parsedata] GO create procedure sp_parsedata (@cid integer,@st varchar(1000)) as declare @coid integer declare @c integer declare @c1 integer select @c1=len(@st) - len(replace(@st, ',', '')) set @c=0 delete from table1 where complainid=@cid; while (@c<=@c1) begin if (@c<@c1) begin select @coid=cast(replace(left(@st,CHARINDEX(',',@st,1)),',','') as integer) select @st=SUBSTRING(@st,CHARINDEX(',',@st,1)+1,LEN(@st)) end else begin select @coid=cast(@st as integer) end insert into table1(complainid,courtid) values(@cid,@coid) set @c=@c+1 end 

प्रतिस्थापन / लेन परीक्षण प्यारा है, लेकिन शायद बहुत अक्षम है (विशेष रूप से मेमोरी के मामले में)। लूप के साथ एक सरल कार्य नौकरी करेगा

 CREATE FUNCTION [dbo].[fn_Occurences] ( @pattern varchar(255), @expression varchar(max) ) RETURNS int AS BEGIN DECLARE @Result int = 0; DECLARE @index BigInt = 0 DECLARE @patLen int = len(@pattern) SET @index = CHARINDEX(@pattern, @expression, @index) While @index > 0 BEGIN SET @Result = @Result + 1; SET @index = CHARINDEX(@pattern, @expression, @index + @patLen) END RETURN @Result END 

शायद आपको इस तरह से डेटा संग्रहीत नहीं करना चाहिए यह एक क्षेत्र में अल्पविराम से सीमांकित सूची को कभी भी संग्रहित करने के लिए एक खराब अभ्यास है पूछताछ के लिए आईटी बहुत ही अक्षम है। यह एक संबंधित तालिका होना चाहिए।