2

我有一个表,我需要在其中比较两列的值。

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

现在匹配可能不是一个完美的词对词匹配。

例如比赛

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。

4

3 回答 3

2

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,Xavier Yellow Zebra(匹配缩写的完整形式)

在另一张桌子上查找

于 2012-12-07T21:44:37.123 回答
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 包含扩展名称,而不是完全按照第一个条件的工作方式作为扩展名称。

于 2012-12-07T21:46:52.823 回答
0

SQL小提琴

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

结果

| 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 |
于 2015-11-06T00:23:19.287 回答