我有桌子'产品'它有一列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查询?
答案 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%');