我有一个验证函数,我想在表中的每个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结果。
答案 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