在Sql中使用通配符来匹配模式

时间:2015-01-30 10:19:02

标签: sql oracle11g wildcard

我试图使用LIKE匹配sql中的模式。

我有P1Sign中的值:

XKA,
XKB,
XSA,
XSB,
XAA, 
any other combination starting with X

我喜欢这样匹配:

XK% = A,
XS% = B,
X[!KS]% = C, (string staring with X, where 2nd char not K or S)

我把一个名为T16Kode的表放入T16.Besk

Sql:

AND P1Sign LIKE T16.Besk ('XS%')

AND P1Sign LIKE T16.Besk ('XK%')

正常工作并找到XKA,XKB和XSA,XSB 但是

AND P1Sign LIKE T16.Besk ('X[!KS]%')

与XAA不匹配

当我运行这个时,我希望它能够获得XAA所以我可以将它与'C'相匹配 为什么我没有得到预期的结果?我不能用[!KS]?有没有其他方法可以在sql中解决这个问题?

以下是更多的sql:

FROM p1perso P1 LEFT OUTER JOIN T16KODE T16 ON P1.p1adm = T16.T16Adm AND T16.T16KType = 'BHSIGN' AND P1.P1Sign LIKE T16.Besk

2 个答案:

答案 0 :(得分:0)

  

X [!KS]%= C,(字符串用X盯着,第二个字符不是K或S)

如何简单SUBSTR -

SQL> WITH DATA AS(
  2  SELECT 'XKA' str FROM dual UNION ALL
  3  SELECT 'XKB' FROM dual UNION ALL
  4  SELECT 'XSA' FROM dual UNION ALL
  5  SELECT 'XSB' FROM dual UNION ALL
  6  SELECT 'XAA' FROM dual
  7  )
  8  SELECT str
  9  FROM DATA
 10  WHERE SUBSTR(str, 1, 1)    = 'X'
 11  AND SUBSTR(str, 2, 1) NOT IN ('K', 'S');

STR
---
XAA

SQL>

其中,SUBSTR(str, 1, 1)用于检查第一个字符,SUBSTR(str, 2, 1)用于检查第二个字符。

答案 1 :(得分:0)

您可以使用regexp_like

WITH DATA AS(
    SELECT 'XKA' str FROM dual UNION ALL
    SELECT 'XKB' FROM dual UNION ALL
    SELECT 'XSA' FROM dual UNION ALL
    SELECT 'XSB' FROM dual UNION ALL
    SELECT 'XAA' FROM dual
    )
    SELECT str
    FROM DATA
    WHERE regexp_like (str, 'X[^KS]');



X -> first character
^[KS] -> second character not in K or S