【问题标题】:Select Query is not showing result exactly with WHERE condition 1=0 or 1=1选择查询未完全显示 WHERE 条件 1=0 或 1=1 的结果
【发布时间】:2015-07-03 20:38:45
【问题描述】:

以下是我的存储过程,它执行良好,没有错误,但数据未根据参数值正确显示。

例如:

exec dbo.[SP_ViewAdvanceSearchDetails] 
NULL,NULL,NULL,'AP','Saudi','1','2','2','Looking',NULL

默认情况下,即使表格中没有数据,数据也会显示整个列表

我的问题是WHERE clause 1=1(所有默认值都可以正常工作,但是当我更改参数值时数据显示错误。)和 1=0(当我传递一些值时工作正常)

我开始头疼,不知道该怎么办。

       DECLARE @sql nvarchar(max)
      SET @sql=N'SELECT        Tbl_JobSeekers.National_Id,       Tbl_JobSeekers.JobSeeker_EnglishName, Tbl_JobSeekers.JobSeeker_Arabicname, Tbl_JobSeekers.Mobile, Tbl_JobSeekers.City, 
                     Tbl_JobSeekers.Nationality, Tbl_JobSeekers.Education, Tbl_JobSeekers.Experience, Tbl_JobSeekers.Category, Tbl_JobSeekers.JobSeekerStatus, 
                     Tbl_JobSeekers.StatusEmployer, Tbl_JobSeekers.ImagePath, Tbl_JobSeekers.ResumePath, Tbl_JobSeekers.Remarks, Tbl_JobSeekers.Email, 
                     Tbl_JobSeekers.Created_Date, Tbl_City.City_Name, Tbl_Qualification.Education_Name, Tbl_Experience.Experience_Years, Tbl_Categories.Category_Name, 
                     Tbl_Employers.Employer_EnglishName
  FROM Tbl_JobSeekers INNER JOIN
                     Tbl_City ON Tbl_JobSeekers.City = Tbl_City.City_Id INNER JOIN
                     Tbl_Qualification ON Tbl_JobSeekers.Education = Tbl_Qualification.Education_Id INNER JOIN
                     Tbl_Experience ON Tbl_JobSeekers.Experience = Tbl_Experience.Experience_Id INNER JOIN
                     Tbl_Categories ON Tbl_JobSeekers.Category = Tbl_Categories.Category_Id LEFT OUTER JOIN
                     Tbl_Employers ON Tbl_JobSeekers.StatusEmployer = Tbl_Employers.Employer_Id WHERE (1=0) '

--set @sql = @sql + ' 1=1 OR '
if (@National_Id is NOT NULL ) set @sql = @sql + ' OR Tbl_JobSeekers.National_Id LIKE ''%' + @National_Id  + '%'' '
if (@JobSeeker_EnglishName is not NULL) set @sql = @sql + ' OR Tbl_JobSeekers.JobSeeker_EnglishName LIKE ''%' + @JobSeeker_EnglishName + '%'' '
if (@Mobile is not NULL) set @sql = @sql + ' OR Tbl_JobSeekers.Mobile LIKE ''%' + @Mobile + '%'' '
if (@City <> 'All') set @sql = @sql + ' OR Tbl_JobSeekers.City=@City  '
if (@Nationality is not NULL) set @sql = @sql + ' OR Tbl_JobSeekers.Nationality=@Nationality '
if (@Education <> 'All') set @sql = @sql + ' OR Tbl_JobSeekers.Education=@Education  '
if (@Experience <> 'All') set @sql = @sql + ' OR Tbl_JobSeekers.Experience=@Experience '
if (@Category <> 'All') set @sql = @sql + ' OR Tbl_JobSeekers.Category=@Category '
if (@JobSeekerStatus <> 'All') set @sql = @sql + ' OR Tbl_JobSeekers.JobSeekerStatus=@JobSeekerStatus '
if (@Email is not NULL) set @sql = @sql + ' OR Tbl_JobSeekers.Email LIKE ''%' + @Email + '%'' '


--PRINT @National_Id --+',' + @JobSeeker_EnglishName + ',' + @Mobile + ',' + @City + ',' + @Nationality + ',' + @Education + ',' + @Experience + ',' + @Category + ',' + @JobSeekerStatus + ',' +  @Email

PRINT @sql

 EXEC sp_executesql @sql,

 N'@National_Id nvarchar(25),@JobSeeker_EnglishName nvarchar(50), @Mobile nvarchar(25), @City varchar(10), @Nationality varchar(10), @Education varchar(10) , @Experience nvarchar(25), @Category nvarchar(25), @JobSeekerStatus nvarchar(25), @Email nvarchar(100)',
  @National_Id, @JobSeeker_EnglishName, @Mobile, @City, @Nationality, @Education, @Experience ,@Category, @JobSeekerStatus, @Email


END

【问题讨论】:

  • 我可以知道为什么我们需要 where 1=1 或 1=0 与 OR 条件一起使用吗?有什么需要呢?请参阅下面的建议答案

标签: sql sql-server stored-procedures where-clause sql-like


【解决方案1】:

完全省略常量怎么样?然后,将您的 where 子句放在一起:

declare @where varchar(max) = '';

if (@National_Id is NOT NULL ) 
set @where = @where + ' OR Tbl_JobSeekers.National_Id LIKE ''%' 
                    + @National_Id + '%'' '

. . .

最后,

set @sql = @sql + (case when @where <> ''
                        then 'where ' + stuff(@where, 1, 3, '')
                        else ''
                   end);

【讨论】:

    【解决方案2】:

    正如所写,一旦你到达​​p>

    OR 1=1 或……

    查询返回所有记录,因为 (1=1) 为 TRUE,其余的无关紧要。

    这就是为什么您要使用其他变量来构建 WHERE 子句并在之后添加它的原因

    给定:

     DECLARE @SQL VARCHAR(max)
        ,   @WHERE VARCHAR(MAX) = ''
    

    然后

    -- take the WHERE 1=0 off the END of your current @SQL 
    SET @SQL = '...  Tbl_Employers ON Tbl_JobSeekers.StatusEmployer = Tbl_Employers.Employer_Id ' 
    
    
    -- build your @WHERE
    if (@National_Id is NOT NULL ) set @WHERE = @WHERE + ' OR  Tbl_JobSeekers.National_Id LIKE ''%' + @National_Id  + '%'' '
    if (@JobSeeker_EnglishName is not NULL) set @WHERE = @WHERE + ' OR Tbl_JobSeekers.JobSeeker_EnglishName LIKE ''%' + @JobSeeker_EnglishName + '%'' '
    if (@Mobile is not NULL) set @WHERE = @WHERE + ' OR Tbl_JobSeekers.Mobile LIKE ''%' + @Mobile + '%'' '
    if (@City <> 'All') set @WHERE = @WHERE + ' OR Tbl_JobSeekers.City=@City  '
    if (@Nationality is not NULL) set @WHERE = @WHERE + ' OR Tbl_JobSeekers.Nationality=@Nationality '
    if (@Education <> 'All') set @WHERE = @WHERE + ' OR Tbl_JobSeekers.Education=@Education  '
    if (@Experience <> 'All') set @WHERE = @WHERE + ' OR Tbl_JobSeekers.Experience=@Experience '
    if (@Category <> 'All') set @WHERE = @WHERE + ' OR Tbl_JobSeekers.Category=@Category '
    if (@JobSeekerStatus <> 'All') set @WHERE = @WHERE + ' OR Tbl_JobSeekers.JobSeekerStatus=@JobSeekerStatus '
    if (@Email is not NULL) set @WHERE = @WHERE + ' OR Tbl_JobSeekers.Email LIKE ''%' + @Email + '%'' '
    
    -- conditionally add @WHERE to @SQL 
    IF LEN(@WHERE) > 0 SET @SQL = @SQL + ' WHERE 1=0 ' + @WHERE;
    -- note: if @WHERE is empty, there is NO WHERE clause at all
    

    【讨论】:

      【解决方案3】:

      我希望您的OR 声明不是必需的。在您使用的代码中,WHERE 1=0 OR 匹配其他一些条件。无论如何,如果其中一个为真WHERE 1=0 OR &lt;your sql condition&gt;,它将返回记录。第一个条件将默认返回 false,第二个条件需要为 true。我们不需要 where 1=0 or where 1=1 将其与 OR 条件一起使用。就这样放着就好了

      SET @sql=N'SELECT        Tbl_JobSeekers.National_Id,       Tbl_JobSeekers.JobSeeker_EnglishName,      Tbl_JobSeekers.JobSeeker_Arabicname, Tbl_JobSeekers.Mobile, Tbl_JobSeekers.City, 
                           Tbl_JobSeekers.Nationality, Tbl_JobSeekers.Education, Tbl_JobSeekers.Experience,   Tbl_JobSeekers.Category, Tbl_JobSeekers.JobSeekerStatus, 
                           Tbl_JobSeekers.StatusEmployer, Tbl_JobSeekers.ImagePath, Tbl_JobSeekers.ResumePath, Tbl_JobSeekers.Remarks, Tbl_JobSeekers.Email, 
                           Tbl_JobSeekers.Created_Date, Tbl_City.City_Name, Tbl_Qualification.Education_Name, Tbl_Experience.Experience_Years, Tbl_Categories.Category_Name, 
                           Tbl_Employers.Employer_EnglishName
        FROM Tbl_JobSeekers INNER JOIN
                           Tbl_City ON Tbl_JobSeekers.City = Tbl_City.City_Id INNER JOIN
                           Tbl_Qualification ON Tbl_JobSeekers.Education = Tbl_Qualification.Education_Id INNER JOIN
                           Tbl_Experience ON Tbl_JobSeekers.Experience = Tbl_Experience.Experience_Id INNER JOIN
                           Tbl_Categories ON Tbl_JobSeekers.Category = Tbl_Categories.Category_Id LEFT OUTER JOIN
                           Tbl_Employers ON Tbl_JobSeekers.StatusEmployer = Tbl_Employers.Employer_Id'
      

      尝试像这样执行你的 sp

      exec dbo.[SP_ViewAdvanceSearchDetails] 'NULL','NULL','NULL','AP','Saudi','1','2','2','Looking','NULL'
      

      在这之间,为什么所有的列都是 varchar 类型的?是这个要求吗?

      【讨论】:

        猜你喜欢
        • 2020-09-07
        • 1970-01-01
        • 1970-01-01
        • 2017-06-24
        • 2017-03-06
        • 1970-01-01
        • 2018-04-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多