SQL 如果值大于则使用 Where 子句

SQL Where clause use if value greater than

我尝试创建可选 query.I 在 sql proc 4 参数中有。

ALTER PROCEDURE [dbo].[sp_OdevTümBilgiler]
@ogretmenUserId int,

@ogrenciUserId int,
@odevAdi nvarchar(50) = null,
@odevId int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
 SELECT
  s.*,
  o.*,
  ko.*,
  ogretmenUser.UserID AS OgretmenUserId,
  ogrenciUser.UserID AS OgrenciId,
  (ogretmenUser.Name + ' ' + ogretmenUser.Surname) AS OgretmenFullName,
  (ogrenciUser.Name + ' ' + ogrenciUser.Surname) AS OgrenciFullName
FROM KullaniciOdev AS ko
INNER JOIN Odev o
  ON ko.OdevId = o.OdevId
INNER JOIN FrUser ogrenciUser
  ON ogrenciUser.UserID = ko.UserId
INNER JOIN Sinif s
  ON s.SinifId = o.ClassId
INNER JOIN FrUser ogretmenUser
  ON ogretmenUser.UserID = s.OlusturanKullaniciId
WHERE 1=1 and (@ogrenciUserId > 0 and ko.UserId = @ogrenciUserId) and
((@ogretmenUserId > 0) and s.OlusturanKullaniciId = @ogretmenUserId) and
(@odevAdi IS NOT NULL and LEN(@odevAdi) > 0 and o.OdevAdi = @odevAdi) and
(@odevId > 0 and ko.OdevId=@odevId)
  END

在我的应用中@ogretmenUserId默认值为-1,

@ogrenciUserId 默认值为-1,

@odevAdi 空,

@odevId -1

但是没有返回正确的值是查询错误吗?

例子 我试试 :

odevId=1 和 ogretmenUserId=1027 但没有返回任何内容

给定以下 WHERE 子句:

WHERE 1=1 and 
      (@ogrenciUserId > 0 and ko.UserId = @ogrenciUserId) and
      ((@ogretmenUserId > 0) and s.OlusturanKullaniciId = @ogretmenUserId) and
      (@odevAdi IS NOT NULL and LEN(@odevAdi) > 0 and o.OdevAdi = @odevAdi) and
      (@odevId > 0 and ko.OdevId=@odevId)

将以下值插入

@odevId=1
@ogretmenUserId=1027
@ogrenciUserId default value is -1,
@odevAdi null,

WHERE 子句变为:

WHERE 1=1 and 
      (-1 > 0 and ko.UserId = -1) and
      ((1027 > 0) and s.OlusturanKullaniciId = 1027) and
      (null IS NOT NULL and LEN(null) > 0 and o.OdevAdi = null) and
      (1 > 0 and ko.OdevId=1)

相当于

WHERE true and 
      false and 
      ((1027 > 0) and s.OlusturanKullaniciId = 1027) and 
      false and 
      (1 > 0 and ko.OdevId=1)

始终为 false

由于根据您的输入参数,它始终为 false,无论您扫描的 table 行的内容如何,​​WHERE 子句始终 returns false,因此不会选择任何行。

只有当您传递正确的值时,您的所有条件才会起作用。当传递默认值时,它将失败。例子考虑第一个条件

(@ogrenciUserId > 0 and ko.UserId = @ogrenciUserId)

这里的默认值是 -1 但代码总是希望它大于 0 因此当 -1 被传递时它将失败。其他条件也一样

您需要 OR 个具有每个参数默认值的条件。因此,当条件将满足默认值或以适当的值传递时。

WHERE  ( @ogrenciUserId = -1 
          OR ko.userid = @ogrenciUserId ) 
       AND ( @ogretmenUserId = -1 
              OR s.olusturankullaniciid = @ogretmenUserId ) 
       AND ( @odevAdi IS NULL 
              OR o.odevadi = @odevAdi ) 
       AND ( @odevId = -1 
              OR ko.odevid = @odevId )