如果有条件,我可以进行验证:
IF(EXISTS
(SELECT TOP 1 [TaskAssignationId]
FROM [Task] AS [T]
INNER JOIN @TaskIdTableType AS [TT] ON [T].[TaskId] = [TT].[Id]
))
但是它返回NULL
的值是因为TaskAssignationId
是NULL
,因此在IF
条件下它是正确的,因为它存在NULL
值,但是我不知道您想将NULL视为值。如何添加null异常?问候
答案 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] )) 开始 - - 码 - - 结束