2012-12-07 4 views
0

J'ai une table dans laquelle j'ai besoin de comparer les valeurs de deux colonnes.Comparaison des valeurs de chaîne de colonnes dans Oracle

Col1  Col2  Col3 
------------------------------------ 
1   sssXYZ2121 XYZ 

Maintenant, une correspondance peut ne pas correspondre parfaitement à un mot.

E.g. d'un match

Col2 Col3 
----- -------------------- 
XYZ  XYZ     (word to word match) 
XYZ  xyz     (can be case insensitive) 
XYZ  gxyzf    (need to search within a string) 
XYZ  xyzjjjjjjjjj   (need to search within a string) 
XYZ  gggggXYZ    (need to search within a string) 
XYZ  Xavier Yellow Zebra (Match the full form of the abbreviation) 

Maintenant, je dois trouver toutes les lignes où la valeur Col3 ne correspondent pas Col2. J'utilise Oracle 10g.

+0

Vos abréviations proviennent d'une autre table? –

+0

Oui, j'ai un tableau différent pour les abréviations – Stu

+0

Pourquoi ne pas utiliser 'regex' alors, étant donné qu'Oracle les prend en charge. Que faire si vous avez 'XYZ',' XavierX Yellowy Zebraz'?Pouvez-vous s'il vous plaît nous montrer vos données de table, sinon nous continuerons à tirer dans le noir: D – bonCodigo

Répondre

1

XYZ, XYZ (mot Troncature)

col2 = col3 

XYZ, xyz (peut être insensible à la casse)

upper(col2) = upper(col3) 

XYZ, gxyzf (besoin de serach dans une chaîne)

upper(col2) like '%'||upper(col3)||'%' 

XYZ, xyzjjjjjjjjj (doit être inséré dans une chaîne)

upper(col2) like upper(col3)||'%' 

XYZ, gggggXYZ (besoin de serach dans une chaîne)

upper(col2) like '%'||upper(col3) 

XYZ, Xavier Yellow Zebra (Match la forme complète de l'abréviation)

regarder dans l'autre table

0

Peut-être que quelque chose comme ça fonctionnera pour vous. La clause where a deux conditions, dont une seule doit être remplie. La première condition est satisfaite lorsque la valeur Col3 est trouvée dans Col2, en ignorant la casse. La deuxième condition est satisfaite lorsque Col2 est la version étendue de Col3.

SELECT Col1, Col2, Col3 FROM Tbl1 
LEFT JOIN Abbr ON Col3 = Abbr.Key 
WHERE INSTR(UPPER(Col2), UPPER(Col3)) > 0 OR Col2 = Abbr.ExpandedName 

Si vous voulez, vous pouvez changer la deuxième condition pour permettre Col2 de contenir le nom élargi au lieu de exactement être le nom développé en suivant la façon dont les premiers travaux de l'état.

+0

Essayé en utilisant le code ci-dessus, mais il ne retourne pas de lignes. – Stu

+0

Hmm, il est difficile de savoir ce qui ne causerait aucune ligne. Essayez de supprimer les clauses WHERE et de faire un "SELECT * FROM Tbl1 LEFT JOIN Abbr SUR Col3 = Abbr.Key". Cela peut vous donner des indices sur ce qui se passe. Si cela renvoie des lignes, introduisez les clauses WHERE une à la fois. –

0

SQL Fiddle

Oracle 11g R2 Configuration du schéma:

CREATE TABLE ABBREVIATIONS(
    Short VARCHAR2(10) CONSTRAINT ABBR__S__PK PRIMARY KEY 
         CONSTRAINT ARRB__S__CHK CHECK(Short = UPPER(Short)), 
    Value VARCHAR2(100) CONSTRAINT ABBR__V__U UNIQUE 
         CONSTRAINT ABBR__V__CHK CHECK(Value IS NOT NULL AND Value = UPPER(Value)) 
); 

INSERT INTO Abbreviations VALUES ('XYZ', 'XAVIER YELLOW ZEBRA'); 

CREATE TABLE Tests (Col1, Col2, Col3) AS 
      SELECT 1, 'XYZ', 'XYZ' FROM DUAL 
UNION ALL SELECT 2, 'xyz', 'XYZ' FROM DUAL 
UNION ALL SELECT 3, 'XYZ', 'xyz' FROM DUAL 
UNION ALL SELECT 4, 'xyz', 'xyz' FROM DUAL 
UNION ALL SELECT 5, 'xyz', 'abcdXYZ' FROM DUAL 
UNION ALL SELECT 6, 'xyz', 'XYZefg' FROM DUAL 
UNION ALL SELECT 7, 'xyz', 'ghiXYZjkl' FROM DUAL 
UNION ALL SELECT 8, 'xyz', 'XaViEr YelloW ZeBrAXXYYZZ' FROM DUAL 
UNION ALL SELECT 9, 'Xavier Yellow Zebra', 'XXYZZ' FROM DUAL 
UNION ALL SELECT 10, 'xyz', 'xy -- Not a match -- z' FROM DUAL; 

Query 1:

SELECT * 
FROM Tests t 
WHERE UPPER(Col3) LIKE '%' || UPPER(Col2) || '%' 
OR  EXISTS (
    SELECT 'X' 
    FROM ABBREVIATIONS a 
    WHERE ( UPPER(t.col2) = a.Short 
      OR UPPER(t.Col2) = a.Value) 
    AND REPLACE(UPPER(Col3), a.Short, a.Value) LIKE '%' || a.Value || '%' 
) 

Results:

| COL1 |    COL2 |      COL3 | 
|------|---------------------|---------------------------| 
| 1 |     XYZ |      XYZ | 
| 2 |     xyz |      XYZ | 
| 3 |     XYZ |      xyz | 
| 4 |     xyz |      xyz | 
| 5 |     xyz |     abcdXYZ | 
| 6 |     xyz |     XYZefg | 
| 7 |     xyz |     ghiXYZjkl | 
| 8 |     xyz | XaViEr YelloW ZeBrAXXYYZZ | 
| 9 | Xavier Yellow Zebra |      XXYZZ | 
Questions connexes