une - structure like sql




SQL Server 2008 R2: chaînes correspondantes (2)

J'ai le tableau suivant:

Table:

CREATE TABLE str_matching
(
    colstr varchar(200)
);

Insérer des données:

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')

Sortie attendue: Je souhaite afficher uniquement les enregistrements qui ont des entrées en double, si une chaîne correspond à la dernière partie d'une chaîne, alors je considère comme doublon.

Par exemple: j'ai deux chaînes

  1. 5sXYZA1010B
  2. A1010B

2ème chaîne qui correspond à la fin de la 1ère chaîne, donc vous voulez afficher ces enregistrements.

Note : La longueur de la chaîne n'est pas fixe, elle peut correspondre à tout moment.

Résultat attendu:

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

il peut être match à tout moment.

Pour correspondre à n'importe quel point, utilisez like avec des caractères génériques ( % ) de chaque côté:

Pour plusieurs correspondances, ajoutez 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 +'%'
      )

rextester demo: http://rextester.com/ICIKJ2256

résultats:

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

Compte tenu de la réponse de Martin Smith, je suppose que j'ai mal compris votre intention derrière 'match à tout moment', donc juste pour correspondre à la fin de la chaîne, vous n'utiliseriez pas le + '%' final


Cela devrait le faire ( démo )

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) 

Cependant, si str_matching a plusieurs lignes, les performances seront médiocres. Ajouter un index au verso de la chaîne peut améliorer considérablement les choses - comme dans l'exemple ci-dessous.

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