在我的数据库中,我必须过滤名称以-N
结尾的记录,
但是当我像以下查询中那样使WHERE
子句时,它不会返回任何记录,因为-
是通配符。
我正在Oracle数据库中使用此查询:
select * from product where productname like '%-N'
但是数据库中有以该产品名称结尾的记录
答案 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
如果您没有获得预期的结果,那么可能还有其他事情没有向我们展示。
好运。