sql-server - SQL सर्वर 2008 R2:मिलान तार




sql-server-2008-r2 (4)

आप इसका उपयोग कर सकते हैं।

;WITH CTE AS (
    select *,RN = ROW_NUMBER() OVER (ORDER BY LEN(colstr)) from str_matching 
)
,CTE2 AS (
    SELECT T1.colstr colstr1 ,X.colstr colstr2 FROM CTE T1
        CROSS APPLY (SELECT * FROM CTE T2 WHERE T2.RN > T1.RN AND RIGHT(T2.colstr, LEN(T1.colstr)) = T1.colstr) AS X
)
SELECT colstr1 FROM CTE2 
UNION ALL 
SELECT colstr2 FROM CTE2

परिणाम:

5sXYZA1010B         
A1010B              
AMZ103B15K          
B15K                
XC101               
C101                
502KMD1FZ10009L     
FZ10009L 

मेरे पास निम्न तालिका है:

तालिका:

CREATE TABLE str_matching
(
    colstr varchar(200)
);

डालें डेटा:

INSERT INTO str_matching VALUES('5sXYZA1010B')
INSERT INTO str_matching VALUES('A1010B')
INSERT INTO str_matching VALUES('AMZ103B15K')
INSERT INTO str_matching VALUES('B15K')
INSERT INTO str_matching VALUES('XC101')
INSERT INTO str_matching VALUES('C101')
INSERT INTO str_matching VALUES('502KMD1FZ10009L')
INSERT INTO str_matching VALUES('FZ10009L')
INSERT INTO str_matching VALUES('A9L')
INSERT INTO str_matching VALUES('XZ049L')
INSERT INTO str_matching VALUES('LM101')

अपेक्षित आउटपुट: मैं केवल उन अभिलेखों को प्रदर्शित करना चाहता हूं जिनकी डुप्लिकेट प्रविष्टियां हैं, अगर एक स्ट्रिंग किसी भी स्ट्रिंग के अंतिम भाग में मेल खाता है तो मैं डुप्लिकेट के रूप में विचार कर रहा हूं।

उदाहरण के लिए: मेरे पास दो स्ट्रिंग हैं

  1. 5sXYZA1010B
  2. A1010B

दूसरी स्ट्रिंग जो 1 स्ट्रिंग के अंत में मेल खाता है, इसलिए ऐसे रिकॉर्ड प्रदर्शित करना चाहते हैं।

नोट : स्ट्रिंग की लंबाई तय नहीं होती है, यह किसी भी बिंदु पर मिलान हो सकती है।

अपेक्षित परिणाम:

colstr              
--------------------
5sXYZA1010B         
A1010B              
AMZ103B15K          
B15K                
XC101               
C101                
502KMD1FZ10009L     
FZ10009L        

यह किसी भी बिंदु पर मैच हो सकता है।

किसी भी बिंदु से मेल करने के लिए, प्रत्येक पक्ष पर वाइल्डकार्ड ( % ) की like उपयोग करें:

कई मैचों के लिए, distinct जोड़ें

select l.colstr
from str_matching l
  inner join str_matching r
    on l.colstr<>r.colstr
   and (l.colstr like '%' + r.colstr +'%'
     or r.colstr like '%' + l.colstr +'%'
      )

रिक्स्टर डेमो: http://rextester.com/ICIKJ2256

रिटर्न:

+-----------------+
|     colstr      |
+-----------------+
| A1010B          |
| 5sXYZA1010B     |
| B15K            |
| AMZ103B15K      |
| C101            |
| XC101           |
| FZ10009L        |
| 502KMD1FZ10009L |
+-----------------+

मार्टिन स्मिथ का जवाब देते हुए, मैं अनुमान लगाता हूं कि मैं 'किसी भी समय मैच' के पीछे अपने इरादों को गलत समझाता हूं, इसलिए स्ट्रिंग के अंत से मेल खाने के लिए आप पिछली बार + '%' उपयोग नहीं करेंगे


यह करना चाहिए ( डेमो )

SELECT DISTINCT CA.colstr
FROM   str_matching s1
       JOIN str_matching s2
         ON s1.colstr <> s2.colstr
            AND s2.colstr LIKE '%' + s1.colstr
       CROSS APPLY (VALUES(s1.colstr),
                          (s2.colstr)) CA(colstr) 

हालांकि यदि str_matching पास कई पंक्तियों का प्रदर्शन खराब होगा। स्ट्रिंग के पीछे एक इंडेक्स को जोड़ने से चीजें काफी हद तक सुधार हो सकती हैं - नीचे दिए गए उदाहरण के अनुसार

CREATE TABLE str_matching
(
    colstr varchar(200),
    colstr_rev AS REVERSE(colstr)
);

CREATE INDEX ix_colstr_rev on str_matching(colstr_rev)

SELECT colstr = REVERSE(CA.colstr_rev)
FROM   str_matching s1
       JOIN str_matching s2
         ON s1.colstr_rev <> s2.colstr_rev
            AND s2.colstr_rev LIKE  s1.colstr_rev + '%' 
       CROSS APPLY (VALUES(s1.colstr_rev),
                          (s2.colstr_rev)) CA(colstr_rev) 
GROUP BY CA.colstr_rev

प्रयत्न:

EXEC sp_rename 'TableName.OldName', 'NewName', 'COLUMN'




sql sql-server sql-server-2008-r2