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




sql-server sql-server-2008-r2 (2)

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

तालिका:

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

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


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

;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 




sql-server-2008-r2