जांचें कि स्ट्रिंग सही प्रारूप का पालन कर रही है या नहीं। सही प्रारूप इस प्रकार है: 0000/00000। अब तक मुझे यही मिला है:

declare @ID nvarchar = '0000/00000'


SELECT (case when len(@id) not between 1 and 12 OR @id not like( '[0-9][0-9][0-9][0-9]' + '/' + '[0-9][0-9][0-9][0-9][0-9]')
                                 OR LEFT(@id,13) LIKE '%[0-9]&' then 'OK' else 'ERROR' end
-1
michNik 9 अप्रैल 2020, 16:18
1
हमें कुछ नमूना तालिका डेटा और अपेक्षित परिणाम दिखाएं। (स्वरूपित पाठ के रूप में, कोई चित्र नहीं।)
 – 
jarlh
9 अप्रैल 2020, 16:19
कृपया इसे पढ़ें अपने प्रश्न को बेहतर बनाने की कुछ युक्तियों के लिए।
 – 
HABO
9 अप्रैल 2020, 17:05

2 जवाब

क्यों न केवल not like का उपयोग करें?

where @id not like '[0-9][0-9][0-9][0-9]/[0-9][0-9][0-9][0-9][0-9]'

मुझे लगता है कि "0" का अर्थ है कि किसी भी अंक की अनुमति है।

0
Gordon Linoff 9 अप्रैल 2020, 16:20
नहीं - केवल स्वीकार्य आईडी 0000/00000 है। यह चीजों को सरल रखता है;)
 – 
Alan Burstein
9 अप्रैल 2020, 20:17
1
तो आप WHERE @id = '0000/00000' ढूंढ रहे हैं?!
 – 
jigga
9 अप्रैल 2020, 20:50

सबसे पहले, यह एक समस्या होगी:

declare @ID nvarchar = '0000/00000'

यह:

declare @ID nvarchar = '0000/00000';
SELECT @ID LEN(@ID), DATALENGTH(@ID);

रिटर्न:

ID   LEN
---- ----
0    1

इसे ध्यान में रखते हुए, ध्यान दें कि यह: PATINDEX({your pattern},@Id) एक प्राकृतिक बूलियन परिणाम लौटाएगा।

DECLARE @ID1     NVARCHAR(1000) = '5555/12312',
        @ID2     NVARCHAR(1000) = '1234/12345678',
        @pattern VARCHAR(100)   = '[0-9][0-9][0-9][0-9]/[0-9][0-9][0-9][0-9][0-9]';

SELECT IsCool = PATINDEX(@pattern,f.Id)
FROM   (VALUES(@ID1),(@ID2)) AS f(Id); 

रिटर्न:

IsCool
-----------
1
0

यदि, 0000/00000 से आपका मतलब है: चार अंक + "/" + पांच अंक तो ये सभी भाव काम करते हैं (ध्यान दें कि मैंने पैटर्न को क्लीनर के लिए एक चर बना दिया है, कोड पढ़ने में आसान है, इसकी आवश्यकता नहीं है):

DECLARE @ID      NVARCHAR(1000) = '5555/12312',
        @pattern VARCHAR(100)   = '[0-9][0-9][0-9][0-9]/[0-9][0-9][0-9][0-9][0-9]';

SELECT CASE PATINDEX(@Pattern,@ID) WHEN 1 THEN 'Ok' ELSE 'Error' END;
SELECT  IIF(PATINDEX(@Pattern,@ID)>0,'Ok','Error');
SELECT  CHOOSE(PATINDEX(@Pattern,@ID)+1,'Error','Ok'); 

आपका कोड बताता है कि @ID 12 वर्णों तक लंबा हो सकता है। मान लें, उदाहरण के लिए, स्वीकार्य प्रारूप थे:
0000/00000
0000/000000
0000/0000000

तब आप यह कर सकते थे:

DECLARE @ID      NVARCHAR(1000) = '5555/12312';

SELECT CASE WHEN LEN(@ID)<13 AND SIGN(PATINDEX('%[0-9][0-9]',@ID)) * 
                 PATINDEX('[0-9][0-9][0-9][0-9]/[0-9][0-9][0-9][0-9][0-9]%',@ID) = 1
            THEN 'Ok' ELSE 'Error' END;

दो अंतिम विचार:

  1. LEN({string}) ऋणात्मक नहीं हो सकता; LEN(@ID) <13 ट्रिक करेगा
  2. यदि अधिकतम लंबाई वास्तव में 12 है तो पैरामीटर या चर NVARCHAR(13) बनाएं। इस तरह, उदाहरण के लिए, कोई 8000 वर्ण स्ट्रिंग में गुजरता है, SQL को यह निर्धारित करने के लिए पूरी चीज़ को स्कैन करने की आवश्यकता नहीं है कि यह मान्य नहीं है।
0
Alan Burstein 9 अप्रैल 2020, 20:56