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

问题描述 投票:0回答:4

在我的数据库中,我必须过滤名称以

-N
结尾的记录, 但是当我像下面的查询一样创建
WHERE
子句时,它不会返回任何记录,因为
-
是通配符。

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

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

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

sql oracle
4个回答
6
投票

起初我以为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)。

- – —

1
投票

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

因此,从以

'N'
结尾的名称开始:

where productname like '%N' 

这符合你的要求吗?

如果没有,您可以转到正则表达式。 例如,要在

'N'
之前查找除数字或字母之外的任何内容:

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

如果这没有返回您期望的结果,您可以优化

regexp_like()


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 在这里

祝你好运。


0
投票

我也有类似的问题。 如果 LIKE 搜索模式中包含连字符,则不会返回任何结果。 我正在使用 MySQL 并尝试通过 PHP 和各种 SQL 管理工具进行查询。搜索模式是在测试中从数据库复制的,因此字符应该相同。 奇怪的是,如果连字符是搜索模式中的最后一个字符,它会返回其匹配项,但一旦连字符后面有另一个字符,它就不起作用。 我尝试用正斜杠转义连字符,但它不起作用。 例如以下作品:

LIKE '%<div class="editable canvas" data-%'

但不是这个:

LIKE '%<div class="editable canvas" data-field%'

如果您需要进行大量可能包含连字符的子字符串搜索,那么这是一个主要问题。

© www.soinside.com 2019 - 2024. All rights reserved.