2016-04-22 14 views
2

Ich habe eine Tabelle 'Produkte', die eine Spalte partnumber hat.Mysql Suche mit ignorieren Sonderzeichen

Ich möchte Sonderzeichen aus Datensatz während der Suche ignorieren.

Angenommen, ich habe folgende 5 Datensätze in Artikelnummer:

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

Jetzt, wenn ich versuche, "XP1" suchen, dann sollte Output wie folgende Aufzeichnungen kommen wird

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

Wie mysql schreiben Abfrage dafür?

Antwort

0

Sie müssen REGEXP verwenden, um Suchvorgänge zuzulassen. EX:

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

Dies lässt es die Datenbank durchsuchen etwas mit X zu finden, P, 1.

Here ist ein Live-Beispiel. Und regexp Informationen für Sie mehr zu sehen. Official docs, ich hasse es, sie zu lesen, besonders Orakel.

.......

+0

Die Ergebniseigenschaft wird nicht angezeigt. Es sollte nur die Ergebnisse anzeigen, bei denen XP1 erstellt wurde. und wenn es zwischen XP und 1 irgendwelche Sonderzeichen gibt, sollte es diese Ergebnisse ignorieren und anzeigen. Nur Sonderzeichen sollten ignoriert, aber nicht benötigt werden, um jedes Zeichen als separaten Suchbegriff zu trennen. "XP" sollte kombiniert werden. – user3264863

+0

Sorry, links aus \ - am Ende davon. Solange es zitiert wird, wenn Sie das Zeichen entkommen, sollte es funktionieren. Ich aktualisierte den Link. – Jorden

+0

Jetzt sieht es besser aus als vorher. Im angegebenen Beispiel wir wissen, dass es ein "-" Zeichen enthält, aber jetzt nehme ich an, dass ich @, _ und \ Zeichen in der Abfrage ignorieren muss, und dann wie ich es schreiben soll. Ich meine, dass es ausgewählte Zeichen aus der Abfrage anstelle des festen '-' Symbols ignorieren soll. – user3264863

0

Definieren einer MySQL Funktion, die die Symbole aus einer Zeichenfolge versehen Streifen.

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 ; 

dann die Datensätze aus Ihrer Tabelle auswählen, in dem die partnumber mit den gestrippt Symbole enthält XP1:

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

Dies könnte sehr langsam sein, wenn Sie Ihren Tisch groß ist. In diesem Fall sollten Sie in generierte Spalten schauen (wenn Sie MySQL 5.7.6 oder höher haben) oder einen Trigger erstellen (falls eine frühere Version), um eine Spalte in Ihrer Tabelle mit partnumber mit entfernten Symbolen zu aktualisieren.

0

Sie können diese Funktionalität mit der Funktion concat() erreichen. Wie ich Ihren und Jorden Antwortkommentar überprüfen kann, dass Sie Zeichenfolge XP1 mit ignorieren Sonderzeichen wie -,_,@ suchen möchten.

So können Sie diese Abfrage

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

Hinweis verwenden: Ausgabe Erfordern Sie auf SQLFIDDLE überprüfen und Sie können Abfrage basierend auf Ihre zusätzliche Anforderung anpassen.