在我的数据库中,我必须过滤名称以
-N
结尾的记录,
但是当我像下面的查询一样创建 WHERE
子句时,它不会返回任何记录,因为 -
是通配符。
我在 Oracle 数据库中使用此查询:
select * from product where productname like '%-N'
但是数据库有以该产品名称结尾的记录
起初我以为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-破折号 (0x2013、Alt+0150)、Em-破折号 (0x2014、Alt+0151)。
- – —
'-'
不是 like
的通配符(如其他地方所述)。
因此,从以
'N'
结尾的名称开始:
where productname like '%N'
这符合你的要求吗?
如果没有,您可以转到正则表达式。 例如,要在
'N'
之前查找除数字或字母之外的任何内容:
where regexp_like(productname, '[^a-zA-Z0-9]N$')
如果这没有返回您期望的结果,您可以优化
regexp_like()
。
您的查询应该按预期工作。这是一个例子:
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
如果您没有得到预期的结果,则说明还有其他事情发生,您没有向我们展示。
祝你好运。
我也有类似的问题。 如果 LIKE 搜索模式中包含连字符,则不会返回任何结果。 我正在使用 MySQL 并尝试通过 PHP 和各种 SQL 管理工具进行查询。搜索模式是在测试中从数据库复制的,因此字符应该相同。 奇怪的是,如果连字符是搜索模式中的最后一个字符,它会返回其匹配项,但一旦连字符后面有另一个字符,它就不起作用。 我尝试用正斜杠转义连字符,但它不起作用。 例如以下作品:
LIKE '%<div class="editable canvas" data-%'
但不是这个:
LIKE '%<div class="editable canvas" data-field%'
如果您需要进行大量可能包含连字符的子字符串搜索,那么这是一个主要问题。