如何在LIKE查询中使用破折号(-)字符

时间:2018-07-10 03:29:29

标签: sql oracle

在我的数据库中,我必须过滤名称以-N结尾的记录, 但是当我像以下查询中那样使WHERE子句时,它不会返回任何记录,因为-是通配符。

我正在Oracle数据库中使用此查询:

 select * from product where productname like '%-N' 

但是数据库中有以该产品名称结尾的记录

3 个答案:

答案 0 :(得分:3)

起初,我认为Oracle允许在[a-z]运算符中指定范围LIKE,并且需要以特殊方式处理-。因此,我的建议是避免破折号:

select * from product where productname like '%\-N' ESCAPE '\'

https://docs.oracle.com/cd/B13789_01/server.101/b10759/conditions016.htm


另一方面,正如@Amadan在评论中正确指出的那样,Oracle的LIKE运算符只能识别两个通配符:_%

这意味着转义-不应更改任何内容。

这意味着查询中的破折号很可能与表中的破折号不同。 Unicode中有很多很多不同的破折号和连字符。这是最常见的。连字符减号(0x002D),En-Dash(0x2013,Alt + 0150),Em-Dash(0x2014,Alt + 0151)。

- – —

答案 1 :(得分:0)

'-'不是like的通配符(如其他地方所述)。

因此,以'N'结尾的名称开头:

where productname like '%N' 

这是您想要的吗?

如果没有,则可以转到正则表达式。例如,要查找'N'之前的数字或字母以外的任何内容:

where regexp_like(productname, '[^a-zA-Z0-9]N$')

如果没有返回您期望的结果,则可以优化regexp_like()

答案 2 :(得分:0)

您的查询应该可以正常工作。这是一个示例:

WITH cteData as (SELECT 'ABC-N' AS PRODUCTNAME FROM DUAL UNION ALL
                 SELECT 'ABCN' AS PRODUCTNAME FROM DUAL UNION ALL
                 SELECT 'ABC' AS PRODUCTNAME FROM DUAL UNION ALL
                 SELECT 'DEFGHI-J-K-L-M-N' AS PRODUCTNAME FROM DUAL UNION ALL
                 SELECT 'DEFGHI-J-K-L-M-' AS PRODUCTNAME FROM DUAL UNION ALL
                 SELECT 'MY DOG HAS FLEAS' AS PRODUCTNAME FROM DUAL)
SELECT *
  FROM cteData
  WHERE PRODUCTNAME LIKE '%-N';

如预期的那样,返回:

ABC-N
DEFGHI-J-K-L-M-N

如果您没有获得预期的结果,那么可能还有其他事情没有向我们展示。

SQLFiddle here

好运。