Sql if else条件不能正常工作

时间:2014-09-22 05:37:33

标签: c# sql sql-server-2008 tsql sql-server-2012

我在c#代码中嵌入了以下sql。

它是一个搜索查询,搜索基于城市和地址。

查询如下,

string sql = "declare @v int;set @v=-1;declare @st varchar(1000);";
    sql += "set @st='select PLACEID,LEFT(CONVERT(NVARCHAR(1000),description),500)+''...'' as des1,LOCATIONCITY,ADDRESS,DateT,RENT from infoone  where '";

    int x = 0;
    string ft = "";
    string sql1 = "";

    sql += "; Select @v= count(address) from infoone  where(";

    foreach (string s in str)
    {
        if (x == 0)
        {
            ft += " " + s;


            sql += "(address like '%" + ft.Remove(0, 1) + "%')";
            sql1 += "(address like ''%" + ft.Remove(0, 1) + "%'')";


        }
        else
        {
            ft += " " + s;
            sql += " OR (address like '%" + ft.Remove(0, 1) + "%')";//ft.Remove(0, 1)
            sql1 += " OR (address like ''%" + ft.Remove(0, 1) + "%'')";//ft.Remove(0, 1)


        }
        x++;
    }
    sql += "); if @v > 0 begin set @st=@st+'" + sql1 + "'+ 'and ('; end else begin set @st=@st+'" + sql1 + "'+ 'or (';  end ";
    sql1 = "";
    x = 0;
    sql += "; Select @v= count(locationcity) from infoone  where(";
    foreach (string s in str)
    {
        if (x == 0)
        {
            sql += "(locationcity like '%" + s + "%') ";
            sql1 += "(locationcity like ''%" + s + "%'') ";
        }
        else
        {
            sql += " OR (locationcity like '%" + s + "%') ";
            sql1 += " OR (locationcity like ''%" + s + "%'') ";
        }
        x++;
    }
    sql += "); if @v>0 begin set @st=@st+'" + sql1 + ")'+' and ('; end else begin set @st=@st+'" + sql1 + ")'+ 'or ('; end  ";
    x = 0;
    sql1 = "";
    ft = "";
    //sql += " and (";
    sql += "Select @v= count(address) from infoone  where(";
    foreach (string s in str)
    {
        if (x == 0)
        {
            ft += " " + s;


            sql += "(address like '%" + ft.Remove(0, 1) + "%')";
            sql1 += "(address like ''%" + ft.Remove(0, 1) + "%'')";


        }
        else
        {
            ft += " " + s;
            sql += " OR (address like '%" + ft.Remove(0, 1) + "%')";//ft.Remove(0, 1)
            sql1 += " OR (address like ''%" + ft.Remove(0, 1) + "%'')";//ft.Remove(0, 1)


        }
        x++;
    }
    sql += "); if @v>0 begin set @st=@st+'" + sql1 + ")'; end else begin set @st=@st+'" + sql1 + ")';  end  execute(@st);";

问题在于以下一行

sql += "); if @v > 0 begin set @st=@st+'" + sql1 + "'+ 'and ('; end else begin set @st=@st+'" + sql1 + "'+ 'or (';  end ";

sql变量@v像这样分配,

select @v=count(address) from infoone where address like '%edmonton%'

在上面的行中,@ v应该得到' 0'我分开检查了一下。但仍然if条件在下面的代码中运行(不运行它应该的else条件)

sql += "); if @v>0 begin set @st=@st+'" + sql1 + ")'+' and ('; end else begin set @st=@st+'" + sql1 + ")'+ 'or ('; end  ";
x = 0;

最后生成的查询如下,但是再次使用sql execute(...)执行查询。并且主要的sql登录不包含在查询中,

declare @v int;set @v=-1;declare @st varchar(1000);
 set @st='select PLACEID,LEFT(CONVERT(NVARCHAR(1000),description),500)+''.'' as            des1,LOCATIONCITY,ADDRESS,DateT,RENT from infoone  where ';
  Select @v= count(address) from infoone  where((address like '%main%')
   OR
    (address like '%main street%')
     OR (address like '%main street edmonton%'));
      if @v > 0 begin set @st=@st+'(address like ''%main%'') 
      OR (address like ''%main street%'') OR (address like ''%main street        edmonton%'')'+
       'and ('; end else begin set @st=@st+'(address like ''%main%'') OR (address like     ''%main street%'')
        OR (address like ''%main street edmonton%'')'+ 'or (';  end ; 
        Select @v= count(locationcity) from infoone  where((locationcity like '%main%') 
         OR (locationcity like '%street%')  OR (locationcity like '%edmonton%') );
          if @v>0 begin set @st=@st+'(locationcity like ''%main%'')  OR (locationcity  like ''%street%'')  
          OR (locationcity like ''%edmonton%'') )'+' and ('; end else begin set     @st=@st+'(locationcity like ''%main%'')  
          OR (locationcity like ''%street%'')  OR (locationcity like ''%edmonton%'') )'+
           'or ('; end  Select @v= count(address) from infoone  where((address like     '%main%') 
           OR (address like '%main street%') OR (address like '%main street edmonton%'));
            if @v>0 begin set @st=@st+'(address like ''%main%'') OR (address like ''%main street%'') 
            OR (address like ''%main street edmonton%''))'; end else begin set   @st=@st+'(address like ''%main%'') 
            OR (address like ''%main street%'') OR (address like ''%main street edmonton%''))';  end  execute(@st);

请帮我弄清楚我做错了什么,

由于

1 个答案:

答案 0 :(得分:0)

如果我错了,请纠正我,但如果@v>您正在查询0 [操作A]否[操作B]。您期待@v == 0,但它仍在执行[操作A]而不是[操作B]?

  

在上面的行中,@ v应该得到' 0'我分开检查了一下。但仍然if条件在下面的代码中运行(不运行它应该的else条件)

如果@v不等于默认值-1时应执行[操作B],您可能希望将其写为

if @v>=0 then begin...