2012-12-07 26 views
0

我有我需要比较两列中的值的表。比较oracle中的列字符串值

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

现在一场比赛可能不是一个完美的单词匹配词。

E.g.比赛的

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) 

现在我需要在其中找到在Col3值不匹配Col2的所有行。 我正在使用Oracle 10g。

+0

您的缩写来自另一个表吗? –

+0

是的,我有不同的表缩写 – Stu

+0

为什么不使用'正则表达式'然后,如果Oracle支持它们。如果你有 'XYZ','XavierX Yellowy Zebraz'?你可以向我们展示你的表格数据,否则我们会继续在黑暗中拍摄:D – bonCodigo

回答

1

XYZ,XYZ(字与字匹配)

col2 = col3 

XYZ,XYZ(可以是不区分大小写)

upper(col2) = upper(col3) 

XYZ,gxyzf(需要在字符串内检索算法)

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

XYZ,xyzjjjjjjjjj(需要在一个字符串内部进行扫描)

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

XYZ,gggggXYZ(需要一个字符串内检索算法)

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

XYZ,泽维尔黄色斑马(匹配缩写的完整形式)

查找另一个表

0

也许这样的事情会对你有用。 Where子句有两个条件,其中只有一个需要满足。在Col2中找到Col3值时,满足第一个条件,忽略大小写。当Col2是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 

如果你愿意,你可以改变第二个条件允许col2的遵循怎样的第一个条件作品包含扩展名,而不是正好是扩展名。

+0

尝试使用上面的代码,但它没有返回任何行。 – Stu

+0

嗯,很难知道什么会导致没有行。尝试删除WHERE子句并执行“S​​ELECT * FROM Tbl1 LEFT JOIN Abbr ON Col3 = Abbr.Key”。这可能会给你一些线索,看看发生了什么。如果它返回行,则一次引入一个WHERE子句。 –

0

SQL Fiddle

的Oracle 11g R2架构设置

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; 

查询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 |