SQL Server 2008 R2:减少多个条件

SQL Server 2008 R2:减少多个条件,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有多个参数来检查条件。根据条件,我正在准备where条款 下面是我准备的所有条件的SQL文档 我可以减少相同条件下的代码吗?似乎每种情况都不同,因此我认为您只能使用类似的语法来压缩/优化代码: DECLARE @Name VARCHAR(max) = 'John' DECLARE @NameCondition VARCHAR(10) = 'Exact' DECLARE @Phonetic INT = 1 DECLARE @WhereCondition VARCHAR(MAX) = 'WHER

我有多个参数来检查条件。根据条件,我正在准备where条款

下面是我准备的所有条件的SQL文档


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

似乎每种情况都不同,因此我认为您只能使用类似的语法来压缩/优化代码:

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
DECLARE@Name VARCHAR(max)='John'
声明@NameCondition VARCHAR(10)=“精确”
声明@拼音INT=1
声明@WhereCondition VARCHAR(MAX)=“WHERE”
如果@Name“”
开始
将@Test声明为整数
选择@Test=LEN(@Name)-LEN(替换(@Name,“,”)+1
如果@拼音=0
开始
如果@Test=1
开始
如果@NameCondition='Exact'设置@WhereCondition+='FirstName=''+@Name+'''
如果@NameCondition='包含'SET@WhereCondition+='FirstName,如'%'+@Name+'%''和'
否则,如果@NameCondition=”以“SET@WhereCondition+=”FirstName开头,例如“”++@Name+'%''和“
否则,如果@NameCondition=”以“SET@WhereCondition+=”FirstName结尾,如“%”++@Name++“或”
结束
否则,如果@Test>1
开始
--每一个@NameCondition的@peophonic=0和@Test>1
结束
结束
如果@拼音=1,则为ELSE
开始
如果@Test=1
开始
--每一个@NameCondition的@peophonic=1和@Test=1
结束
否则,如果@Test>1
开始
--每一个@NameCondition的@拼音=1和@Test>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);
DECLARE@Name VARCHAR(max)='John'
声明@NameCondition VARCHAR(10)=“精确”
声明@拼音INT=1
声明@WhereCondition VARCHAR(MAX)=“WHERE”
如果@Name“”
开始
如果@拼音=0
开始
如果(LEN(@Name)-LEN(REPLACE(@Name,“,”)+1)=1
开始
如果@NameCondition='Exact'
设置@WhereCondition+='FirstName='+@Name+'';
如果@NameCondition='Containing'
将@WhereCondition+='FirstName设置为'%'+@Name+'%'和';
如果@NameCondition='Start with'
将@WhereCondition+='FirstName设置为''+@Name+'%'和';
如果@NameCondition='End with'
将@WhereCondition+='FirstName设置为'%'+@Name+''或';
结束
如果(LEN(@Name)-LEN(REPLACE(@Name,,,,'')+1)>1
开始
如果@NameCondition='Exact'
将@WhereCondition+=“FirstName”设置为(“”“+”替换(@Name)、“”、“”、“”“+”)和“;
如果@NameCondition='Containing'
设置@WhereCondition+='FirstName LIKE''+替换(@Name'、'、'%'或FirstName LIKE')+'%'和';
如果@NameCondition='Start with'
设置@WhereCondition+='FirstName LIKE''+替换(@Name'、'、'%'或FirstName LIKE')+'%'和';
如果@NameCondition='End with'
设置@WhereCondition+='FirstName(如“%”)+替换(@Name、“、””或FirstName(如“%”))+''和';
结束
结束
如果@拼音=1,则为ELSE
开始
如果(LEN(@Name)-LEN(REPLACE(@Name,“,”)+1)=1
开始
如果@NameCondition='Exact'
设置@WhereCondition+='SOUNDEX(FirstName)=SOUNDEX(''+@Name+'')和';
如果@NameCondition='Containing'
将@WhereCondition+='SOUNDEX(FirstName)设置为类似SOUNDEX('%'+@Name+'%'')或';
如果@NameCondition='Start with'
将@WhereCondition+=”SOUNDEX(FirstName)设置为类似SOUNDEX(''+@Name+'%'')和';
如果@NameCondition='End with'
将@WhereCondition+=”SOUNDEX(FirstName)设置为类似SOUNDEX('%'+@Name+'')和';
结束
如果(LEN(@Name)-LEN(REPLACE(@Name,,,,'')+1)>1
开始
如果@NameCondition='Exact'
将@WhereCondition+=”SOUNDEX(FirstName)设置在(SOUNDEX(“”“+”替换(@Name,“,”)、SOUNDEX(“”“+”)和“);
如果@NameCondition='Containing'
将@WhereCondition+='SOUNDEX(FirstName)设置为类似(SOUNDEX(“%”替换(@Name,“,”%”)、SOUNDEX(“%”)+“%”)和“”;
如果@NameCondition='Start with'
设置@WhereCondition+='SOUNDEX(FirstName)如(SOUNDEX('''+REPLACE(@Name,','%''))、SOUNDEX('''+'%'')和';
如果@NameCondition='End with'
将@WhereCondition+=”SOUNDEX(FirstName)设置为类似(SOUNDEX(“%”替换(@Name,“,”)、SOUNDEX(“%”)和“”);
结束
结束
结束
打印(@WhereCondition);

在代码审查方面可能会有更好的运气,除了应该在问题主体中发布sql fiddle代码外,为什么在检查相同内容时,在每个IF块中都有
IF@Name'
条件检查?此外,您的小提琴没有编译。您的小提琴有单轴错误。即使当fiddle非常有用时,您也应该始终尝试在这里包含代码。因为有时候小提琴放下了,观众就看不到你的代码了。也许不是全部,但至少是相关代码