where子句中的缩写

时间:2017-05-12 01:36:17

标签: sql sql-server sql-server-2008 abbreviation

将缩写视为Sta。等于圣诞老人,或马。等于玛丽亚或马。

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

此查询适用于Maria,但问题是它还包含名称包含marie

案例1:用户输入ma结果为mariamama.,反之亦然。

案例2:用户输入Maria输出为Ma. TeresaMaria TeresaMa Teresasta方案也是如此。

案例3:用户输入sta结果为santasta.sta,反之亦然。

案例4:用户输入普通名称(Jose)没有缩写,结果就像Jose

对这个问题有什么看法吗?或者这个问题的最佳方法是什么?

谢谢。

2 个答案:

答案 0 :(得分:1)

你有缩写的句号,所以这可能会做你想要的:

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

答案 1 :(得分: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 '%'+@Text1+'%' AND @Temp2 LIKE '%'+@Text2+'%'
    BEGIN
        SET @String2 = REPLACE(@Temp2,@Text2,@Text1)
    END
    ELSE IF @Temp1 LIKE '%'+@Text2+'%' AND @Temp2 LIKE '%'+@Text1+'%'
    BEGIN
        SET @String2 = REPLACE(@Temp2,@Text1,@Text2)
    END

    IF @String1 LIKE '%'+@String2+'%'
    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