2017-05-12 58 views
0

對待縮寫Sta。等於聖誕老人或馬。等於瑪麗亞或馬。子句的縮寫

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

該查詢是瑪麗亞,但它也包含了問題名稱包含marie

案例1:用戶輸入ma結果將是mariamama.反之亦然。

情況2:用戶輸入Maria的輸出將是Ma. TeresaMaria TeresaMa Teresa和相同的推移sta場景。情況3:用戶輸入sta結果將爲santa,sta.sta,反之亦然。

案例4:用戶輸入正常的域名(何塞)沒有縮寫,結果會是這樣Jose

對這個問題的任何想法?或者這個問題最好的辦法是什麼?

謝謝。

+2

編輯您的問題,並提供樣品數據和預期結果。 –

+0

我編輯了我的問題,非常感謝。 – Joseph

回答

0

搜索歸一化值。這是函數來檢查,如果搜索包含mama. ....

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 

這是查詢。

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

你有一個週期的縮寫,所以這可能會做你想要什麼:

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

一種方法是讓所有的縮寫表和它們所對應的內容。

本質上,建立一個單獨的表,將擴展縮寫爲全名。

Abbrevs帶有列Abbrev, Name

對於你的榜樣,將包含這些行:

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

然後查找用戶提供的字符串加上這個名字的所有可能的同義詞。類似這樣的:

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 
    ) 
; 

您可以讓用戶定義並編輯Abbrevs表。


如果兩個用戶輸入和表可以有縮寫,你需要使用LIKE,不是一個簡單的=搜索,然後我會做類似於下面的東西。

仍然會有一個單獨的表是擴展的縮寫(或者說一個特定的名稱可能縮寫列表):

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

此外,我將有一個標準化的定名稱的功能。該函數將搜索給定名稱中可能的縮寫並擴展它們。

例如,給定Ma. Teresa,該函數將使用Abbrevs表返回Maria Teresa

您的主表有一個字段Name,其原始名稱可以有縮寫。我將添加另一個(計算或持續)列NormalizedName,這將填充此函數。在實踐中,我將這個列作爲一個正常的持久列,並編寫了一個觸發器,在主列更改時更新其值。標準化的一個步驟是將所有字符串轉換爲大寫字母。您可以在其中創建一些其他規則,例如丟棄所有點,逗號,破折號和其他此類符號,用單個空格替換雙空格等。

向用戶顯示原始值Name值。

當用戶提供了一個名稱來搜索,我正常化使用相同的函數的給定的名稱,並在NormalizedName柱用簡單

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

如果用戶輸入'Maria',則輸出將是'Ma。 Teresa'或'瑪麗亞Teresa'或'Ma Teresa'?有沒有LIKE IN功能? – Joseph

+0

@JAlc,我擴大了答案並增加了我使用的想法 - 規範化名稱。 –

+0

謝謝你的主意! – Joseph