2017-05-12 4 views
0

Behandeln Abkürzung wie Sta. entspricht dem Weihnachtsmann oder Ma. entspricht Maria oder Ma.Abkürzung in Where-Klausel

SELECT * FROM Table1 A WITH(NOLOCK) WHERE A.Name LIKE '%ma%' 

Diese Abfrage ist für Maria, aber das Problem wird es deswegen auch ein Name enthält marie

Fall 1: Benutzereingabe ma das Ergebnis maria wäre, ma und ma. und umgekehrt.

Fall 2: Benutzereingaben Maria die Ausgänge Ma. Teresa oder Maria Teresa oder Ma Teresa und gleiche gilt auf sta Szenario wäre.

Fall 3: Benutzereingabe sta das Ergebnis wäre santa, und sta und umgekehrt.

Fall 4: Benutzereingabe normale Namen (Jose) ohne Abkürzung wäre das Ergebnis wie seine Jose

Jede Idee zu diesem Problem? oder was ist der beste Ansatz für dieses Problem?

Vielen Dank.

+2

Bearbeiten Sie Ihre Frage und liefern Sie Beispieldaten und gewünschte Ergebnisse. –

+0

Ich habe meine Frage bearbeitet, vielen Dank. – Joseph

Antwort

0

verwendet, ist diese Funktion, wenn die Suche zu überprüfen enthält ma, ma. ....

CREATE FUNCTION [dbo].[StringContains] 
(
-- Add the parameters for the function here 
@String1 VARCHAR(MAX), 
@String2 VARCHAR(MAX) 
) 
RETURNS BIT 
AS 
BEGIN 
-- Declare the return variable here 
DECLARE @Result BIT = 0 

DECLARE @IsContain INT = 0 

DECLARE @Equivalents TABLE 
(
    ID INT IDENTITY(1,1), 
    Text1 VARCHAR(50), 
    Text2 VARCHAR(50) 
) 
INSERT INTO @Equivalents (Text1, Text2) 
VALUES ('ma. ','maria'), 
('ma. ','ma '), 
('ma ','maria'), 
('sta. ','santa'), 
('sta. ','sta '), 
('sta ','santa') 

DECLARE @ID INT = 1 
DECLARE @TOTAL INT = (SELECT COUNT(1) FROM @Equivalents) 
WHILE @ID <= @TOTAL 
BEGIN 
    DECLARE 
     @Temp1 VARCHAR(MAX) = @String1, 
     @Temp2 VARCHAR(MAX) = @String2, 
     @Text1 VARCHAR(50), 
     @Text2 VARCHAR(50) 
    SELECT TOP 1 
     @Text1 = Text1, 
     @Text2 = Text2 
    FROM @Equivalents 
    WHERE ID = @ID 

    IF @Temp1 LIKE '%'[email protected]+'%' AND @Temp2 LIKE '%'[email protected]+'%' 
    BEGIN 
     SET @String2 = REPLACE(@Temp2,@Text2,@Text1) 
    END 
    ELSE IF @Temp1 LIKE '%'[email protected]+'%' AND @Temp2 LIKE '%'[email protected]+'%' 
    BEGIN 
     SET @String2 = REPLACE(@Temp2,@Text1,@Text2) 
    END 

    IF @String1 LIKE '%'[email protected]+'%' 
    BEGIN 
     SET @IsContain += 1 
    END 

    SET @ID += 1 
END 

SET @Result = (CASE WHEN @IsContain > 0 THEN 1 ELSE 0 END) 
RETURN @Result 
END 

Und dies ist die Abfrage.

DECLARE @Text VARCHAR(MAX) = 'maria' 
SELECT TOP 100 FullName,* FROM dbo.Table1 WITH(NOLOCK) 
WHERE dbo.StringContains(FullName,@Text) = 1 
1

Sie haben eine Frist für die Abkürzung, so könnte dies tun, was Sie wollen:

WHERE ' ' + A.Name + ' ' LIKE '% Ma. %' 
2

Ein Ansatz ist es, eine Liste aller Abkürzungen haben und was sie entsprechen.

Erstellen Sie im Wesentlichen eine separate Tabelle, die die Abkürzung in den vollständigen Namen erweitert.

Tabelle Abbrevs mit Spalten Abbrev, Name.

Für Ihr Beispiel wird es diese Zeilen enthalten:

Abbrev Name 
ma  Maria 
ma  Ma. 
ma. Maria 
ma. Ma 
sta Santa 
sta Sta. 
sta. Santa 
sta. sta 

für die Zeichenfolge Dann sind die Benutzer zur Verfügung gestellt und alle möglichen Synonymen für diesen Namen. Etwas wie folgt aus:

DECLARE @ParamInput nvarchar(255); 
SET @ParamInput = 'ma'; 

SELECT * 
FROM YourTable 
WHERE 
    YourTable.Name = @ParamInput 
    OR YourTable.Name IN 
    (
     SELECT Abbrevs.Name 
     FROM Abbrevs 
     WHERE Abbrevs.Abbrev = @ParamInput 
    ) 
; 

können Sie lassen Benutzer definieren und bearbeiten Sie die Abbrevs Tabelle.


Wenn beide Benutzereingaben und die Tabelle Abkürzungen haben können, und Sie müssen LIKE verwenden, keine einfaches = für die Suche, dann würde ich so etwas wie die folgenden tun.

Es wird immer noch eine separate Tabelle, die Abkürzungen erweitert (oder vielmehr eine Liste der möglichen Abkürzungen von einem bestimmten Namen):

Abbrev Name 
ma  Maria 
ma. Maria 
sta Santa 
sta. Santa 

Zusätzlich zu, dass ich eine Funktion haben würde, die den gegebenen Namen normalisiert . Die Funktion würde im gegebenen Namen nach möglichen Abkürzungen suchen und diese erweitern.

Zum Beispiel gibt die Funktion Maria Teresa unter Verwendung der Abbrevs Tabelle zurück.

Ihre Haupttabelle hat ein Feld Name mit ursprünglichem Namen, der Abkürzungen haben kann. Ich werde eine weitere (berechnete oder beibehaltene) Spalte NormalizedName hinzufügen, die von dieser Funktion aufgefüllt würde. In der Praxis habe ich eine solche Spalte zu einer normalen persistenten Spalte gemacht und einen Trigger geschrieben, der seinen Wert aktualisiert hat, wenn sich die Hauptspalte Name ändert. Ein Schritt der Normalisierung bestand darin, alle Strings in Großbuchstaben zu bringen. Sie können einige andere Regeln einbauen, wie das Verwerfen aller Punkte, Kommas, Bindestriche und anderer Symbole, das Ersetzen doppelter Leerzeichen durch einzelnes Leerzeichen etc.

Sie zeigen dem Benutzer nur die ursprünglichen Name Werte.

Wenn ein Benutzer einen Namen für die Suche bietet, ich normalisieren den gegebenen Namen die gleiche Funktion und die Suche nach normalisierten Wert in der NormalizedName Spalte mit einer einfachen

WHERE NormalizedName LIKE '%'[email protected]+'%' 
+0

Wenn der Benutzer 'Maria' eingibt, wären die Ausgaben' Ma. Teresa oder Maria Teresa oder Ma Teresa? Gibt es eine LIKE IN Funktion? – Joseph

+0

@JAlc, erweiterte ich die Antwort und fügte eine Idee hinzu, die ich verwendete - Namen normalisieren. –

+0

Vielen Dank für Ihre Idee! – Joseph