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

Using wildcards in Sql to match patterns

我正在尝试使用 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 的 table 并将其加入为 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

X[!KS]% = C, (string staring with X, where 2nd char not K or 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)是检查第二个字符。

你可以利用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