SQL Server 2008 R2:减少多个条件

时间:2015-10-29 14:04:44

标签: sql sql-server sql-server-2008-r2

我有多个参数来检查条件。根据我准备where子句的条件。

这是我准备的所有条件的SQL小提琴。

SQL Fiddle

我可以在相同条件下减少代码吗?

2 个答案:

答案 0 :(得分:1)

似乎每个案例都不同,所以我认为你只能使用类似的语法来压缩/优化代码:

DECLARE @Name VARCHAR(max) = 'John'
DECLARE @NameCondition VARCHAR(10) = 'Exact'
DECLARE @Phonetic INT = 1
DECLARE @WhereCondition VARCHAR(MAX) = 'WHERE '

IF @Name <> ''
BEGIN

    DECLARE @Test AS INTEGER
    SELECT @Test = LEN(@Name) - LEN(REPLACE(@Name,',','')) + 1

    IF @Phonetic = 0
    BEGIN
        IF @Test = 1
        BEGIN
            IF @NameCondition = 'Exact' SET @WhereCondition += ' FirstName = '''+@Name+''''
            ELSE IF @NameCondition = 'Containing' SET @WhereCondition += ' FirstName LIKE ''%'+@Name+'%''  AND'
            ELSE IF @NameCondition = 'Start with' SET @WhereCondition += ' FirstName LIKE '''+@Name+'%''  AND'
            ELSE IF @NameCondition = 'End with' SET @WhereCondition += ' FirstName LIKE ''%'+@Name+'''  OR'
        END
        ELSE IF @Test > 1
        BEGIN
            -- every case of @NameCondition with @Phonetic = 0 and @Test > 1
        END
    END
    ELSE IF @Phonetic = 1
    BEGIN
        IF @Test = 1
        BEGIN
            -- every case of @NameCondition with @Phonetic = 1 and @Test = 1 
        END
        ELSE IF @Test > 1
        BEGIN
            -- every case of @NameCondition with @Phonetic = 1 and @Test > 1 
        END
    END

END

答案 1 :(得分:1)

以下是完整资料来源:

DECLARE @Name VARCHAR(max) = 'John'
DECLARE @NameCondition VARCHAR(10) = 'Exact'
DECLARE @Phonetic INT = 1
DECLARE @WhereCondition VARCHAR(MAX) = 'WHERE '

IF @Name <> ''
BEGIN
    IF @Phonetic = 0
    BEGIN
        IF (LEN(@Name) - LEN(REPLACE(@Name,',','')) + 1) = 1
        BEGIN
            IF @NameCondition = 'Exact'
                SET @WhereCondition += ' FirstName = '''+@Name+'''';
            ELSE IF @NameCondition = 'Containing'
                SET @WhereCondition += ' FirstName LIKE ''%'+@Name+'%''  AND';
            ELSE IF @NameCondition = 'Start with'
                SET @WhereCondition += ' FirstName LIKE '''+@Name+'%''  AND';
            ELSE IF @NameCondition = 'End with'
                SET @WhereCondition += ' FirstName LIKE ''%'+@Name+'''  OR';
        END
        ELSE IF (LEN(@Name) - LEN(REPLACE(@Name,',','')) + 1) > 1
        BEGIN
            IF @NameCondition = 'Exact'
                SET @WhereCondition += ' FirstName IN('''+REPLACE(@Name,',',''',''')+''')  AND';
            ELSE IF @NameCondition = 'Containing'
                SET @WhereCondition += ' FirstName LIKE '''+REPLACE(@Name,',','%'' OR FirstName LIKE ''')+'%''  AND';
            ELSE IF @NameCondition = 'Start with'
                SET @WhereCondition += ' FirstName LIKE '''+REPLACE(@Name,',','%'' OR FirstName LIKE ''')+'%''  AND';
            ELSE IF @NameCondition = 'End with'
                SET @WhereCondition += ' FirstName LIKE ''%'+REPLACE(@Name,',',''' OR FirstName LIKE ''%')+'''  AND';
        END
    END
    ELSE IF @Phonetic = 1
    BEGIN
        IF (LEN(@Name) - LEN(REPLACE(@Name,',','')) + 1) = 1
        BEGIN
            IF @NameCondition = 'Exact'
                SET @WhereCondition += ' SOUNDEX(FirstName) = SOUNDEX('''+@Name+''')  AND';
            ELSE IF @NameCondition = 'Containing'
                SET @WhereCondition += ' SOUNDEX(FirstName) LIKE SOUNDEX(''%'+@Name+'%'')  OR';
            ELSE IF @NameCondition = 'Start with'
                SET @WhereCondition += ' SOUNDEX(FirstName) LIKE SOUNDEX('''+@Name+'%'')  AND';
            ELSE IF @NameCondition = 'End with'
                SET @WhereCondition += ' SOUNDEX(FirstName) LIKE SOUNDEX(''%'+@Name+''')  AND';
        END
        ELSE IF (LEN(@Name) - LEN(REPLACE(@Name,',','')) + 1) > 1
        BEGIN
            IF @NameCondition = 'Exact'
                SET @WhereCondition += ' SOUNDEX(FirstName) IN (SOUNDEX('''+REPLACE(@Name,',',''') , SOUNDEX(''')+'''))  AND';
            ELSE IF @NameCondition = 'Containing'
                SET @WhereCondition += ' SOUNDEX(FirstName) LIKE (SOUNDEX(''%'+REPLACE(@Name,',','%'') , SOUNDEX(''%')+'%''))  AND';
            ELSE IF @NameCondition = 'Start with'
                SET @WhereCondition += ' SOUNDEX(FirstName) LIKE (SOUNDEX('''+REPLACE(@Name,',','%'') , SOUNDEX(''')+'%''))  AND';
            ELSE IF @NameCondition = 'End with'
                SET @WhereCondition += ' SOUNDEX(FirstName) LIKE (SOUNDEX(''%'+REPLACE(@Name,',',''') , SOUNDEX(''%')+'''))  AND';
        END
    END
END


PRINT(@WhereCondition);