sql server - سكل سيرفر 2008 R2:مطابقة السلاسل




2012 advanced (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

في SQL Server 2008 ، يمكنك إدراج صفوف متعددة باستخدام عبارة SQL INSERT واحدة.

INSERT INTO MyTable ( Column1, Column2 ) VALUES
( Value1, Value2 ), ( Value1, Value2 )

للإشارة إلى هذا لديك إلقاء نظرة على دورة MOC 2778A - كتابة استعلامات SQL في SQL Server 2008.





sql sql-server sql-server-2008-r2