空值被认为是现有值

时间:2018-09-27 17:29:33

标签: sql sql-server tsql

如果有条件,我可以进行验证:

IF(EXISTS
    (SELECT TOP 1 [TaskAssignationId]
     FROM [Task] AS [T]
          INNER JOIN @TaskIdTableType AS [TT] ON [T].[TaskId] = [TT].[Id]
))

但是它返回NULL的值是因为TaskAssignationIdNULL,因此在IF条件下它是正确的,因为它存在NULL值,但是我不知道您想将NULL视为值。如何添加null异常?问候

3 个答案:

答案 0 :(得分:4)

如果不想包含[TaskAssignationId]为null的行,则将其添加到WHERE子句中。

IF(EXISTS
    SELECT TOP 1 [TaskAssignationId]
    FROM [Task] AS [T]
    INNER JOIN @TaskIdTableType AS [TT] ON [T].[TaskId] = [TT].[Id]
    WHERE [TaskAssignationId] is not null  
))

答案 1 :(得分:0)

现有的工作方式类似于“(子)查询返回的行是否多于零(相关的行)”,而不是“(子)查询返回的值是否为非空值”

这些完全正确存在:

SELECT * FROM person p
WHERE EXISTS (SELECT null FROM address a WHERE a.personid = p.id)

SELECT * FROM person p
WHERE EXISTS (SELECT 1 FROM address a WHERE a.personid = p.id)

SELECT * FROM person p
WHERE EXISTS (SELECT * FROM address a WHERE a.personid = p.id)

返回什么值或存在多少列都无关紧要,它会在确定结果是否存在时在乎行数是否为0或更大

因此,如果您希望存在检查失败,则必须确保(子)查询不返回任何行。如果具有 null 类型的地址是不可接受的,则(sub)查询必须用WHERE a.type IS NOT NULL排除它们,以便仅考虑非null类型的行

在(子)查询中进行TOP 1也是没有意义的;优化器知道它关心的唯一条件是0行或非0行,因此它会自动执行TOP 1(即,当它知道至少有一行时,它将停止检索数据)

答案 2 :(得分:0)

如果要检查是否存在,则无需分配列名,可以使用select 1

如果存在     选择顶部1 1     从[任务] AS [T]     内联接@TaskIdTableType AS [TT]开启[T]。[TaskId] = [TT]。[Id] )) 开始 - - 码 - - 结束