【问题标题】:Sql if else condition is not working properlySql if else 条件无法正常工作
【发布时间】:2014-11-16 00:24:45
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 你检查它最后返回了什么吗?我的意思是查询。
  • 是的,这就是我说“如果@v > 0”条件为真,即使@v 应该等于0
  • 你可以只粘贴查询,即sql语句吗?很难猜测这行或上一行是否有任何语法错误..
  • @Rafay 我已经用查询更新了问题,但最终生成的查询中没有包含很多逻辑
  • 我没有看到任何语法错误 .. 尝试在 start 中硬编码 @v 的值以检查流程..

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


【解决方案1】:

如果我错了,请纠正我,但你的问题是如果 @v > 0 [Operation A] else [Operation B]。您期待@v == 0,但它仍在执行 [Operation A] 而不是 [Operation B]?

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

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

if @v>=0 then begin...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 2022-01-03
    • 2022-11-03
    • 1970-01-01
    相关资源
    最近更新 更多