选择函数为false的所有记录

时间:2014-11-15 22:24:38

标签: sql sql-server sql-server-2008 function

我有一个验证函数,我想在表中的每个id上运行,并返回那些无效的id。我试过的代码:

select  myID 
from myDB.dbo.myTable
where (myDB.dbo.validateID(myID) = 0)

myDB.dbo.validateID是一个标量值函数。

这有效,但对所有有效ID都返回null - 我只想返回无效的ID。使用此函数返回所有无效行的最有效方法是什么?

更新

如果ID有效,则validateID函数返回1,如果不是则返回0。

如果ID有效,我上面的代码将返回null,如果不是,则返回ID。我希望它只返回无效的ID,而不是所有的null结果。

2 个答案:

答案 0 :(得分:1)

select  myID 
from myDB.dbo.myTable
where (myDB.dbo.validateID(myID) = 0)
     

这有效,但对所有有效ID

返回null

这根本不可能。如果您选择myID,则会获得myID,因此如果您获得null,则myID必须为null,并且您的validateID功能为检测到无效。

如果您的功能应将null视为有效ID,则需要修复您的功能,以便myDB.dbo.validateID(null)返回1

如果您的功能应将null视为有效ID或无效ID,则需要修复您的功能,以便myDB.dbo.validateID(null)返回null

如果您的功能应将null视为无效ID,但您仍希望排除null结果,只需在您的选择中添加条件myID is not null

答案 1 :(得分:0)

我尝试了相同的逻辑但是按预期获得了正确的输出。仅在函数输出0 (ie) Invalid records时才返回行。我没有看到NULL的{​​{1}}值。

valid records

<强>输出

create table dbo.Contracts1(id int,name varchar(50),pric int)
INSERT INTO dbo.Contracts1
VALUES     ( 1,'invalid',40000),
            (2,'valid',50000),
            (3,'valid',35000),
            (4,'invalid',40000)

CREATE FUNCTION Testt(@id INT)
returns INT
AS
  BEGIN
      DECLARE @ret INT
      IF EXISTS (SELECT 1
                 FROM   dbo.Contracts1
                 WHERE  name = 'Valid'
                        AND id = @id)
        SELECT @ret = 1
      ELSE
        SELECT @ret = 0
      RETURN @ret
  END

SELECT *
FROM   dbo.Contracts1
WHERE  dbo.Testt(id) = 0