使用忽略特殊字符的Mysql搜索

时间:2016-04-22 04:28:54

标签: mysql

我有桌子'产品'它有一列partnumber

我想在搜索时忽略记录中的特殊字符。

假设我在partnumber中有以下5条记录:

XP-12345
MV-334-3454
XP1-5555
VX-AP-XP-1000 
VT1232223

现在,如果我尝试搜索" XP1",那么输出应该跟随记录

XP-12345
XP1-5555
VX-AP-XP-1000

如何为此编写mysql查询?

4 个答案:

答案 0 :(得分:0)

您需要使用REGEXP来允许包含搜索。 EX:

SELECT partnumber 
  FROM partnumber_tbl 
 WHERE name REGEXP '[XP1]\-';

这将让它搜索数据库以查找包含X,P,1的任何内容。

Here是一个实例。 并regexp信息让您了解更多信息。 Official docs,我讨厌读它们,尤其是神谕。

.......

答案 1 :(得分:0)

定义一个MySQL函数,用于从提供的字符串中删除符号。

DELIMITER //
CREATE FUNCTION STRIP_SYMBOLS(input VARCHAR(255))
RETURNS VARCHAR(255) DETERMINISTIC NO SQL
BEGIN
    DECLARE output VARCHAR(255) DEFAULT '';
    DECLARE c CHAR(1);
    DECLARE i INT DEFAULT 1;
    WHILE i < LENGTH(input) DO
        SET c = SUBSTRING(input, i, 1);
        IF c REGEXP '[a-zA-Z0-9]' THEN
            SET output = CONCAT(output, c);
        END IF;
        SET i = i + 1;
    END WHILE;
    RETURN output;
END//
DELIMITER ;

然后从表格中选择带有符号的partnumber包含XP1的记录:

SELECT * FROM products WHERE STRIP_SYMBOLS(partnumber) LIKE '%XP1%';
-- Returns: XP-12345, XP1-5555, VX-AP-XP-1000

如果您的桌子很大,这可能会非常缓慢。在这种情况下,查看生成的列(如果您有MySQL 5.7.6或更高版本)或创建触发器(如果是早期版本),以使表中的列更新为partnumber并删除符号。

答案 2 :(得分:0)

您可以使用concat()功能实现此功能。我可以查看你和Jorden的评论,你想要用-,_,@忽略特殊字符来搜索字符串XP1。

所以你可以使用这个查询

SELECT partnumber FROM products 
   WHERE partnumber LIKE concat('%XP','_','1%') 
   OR partnumber LIKE '%XP1%';;

注意:需要输出,您可以在SQLFIDDLE上查看,并且您可以根据您的其他要求调整查询。

答案 3 :(得分:0)

你可以这样做:

SELECT partnumber
FROM products
WHERE REPLACE(partnumber, "_", "")) LIKE '%XP1%');