2014-11-15 2 views
1

У меня есть функция проверки, которую я хотел бы запускать на каждом идентификаторе в таблице, и возвращать только те идентификаторы, которые являются недопустимыми. Код, который я пробовал:Выберите все записи, где функция ложна

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

Где myDB.dbo.validateID это скалярная функция.

Это работает, но возвращает null для всех допустимых идентификаторов - я хочу только вернуть недействительные. Каков наиболее эффективный способ вернуть все недопустимые строки с помощью этой функции?

Update:

Функция validateID возвращает 1, если идентификатор является действительным, 0, если это не так.

Мой код выше возвращает null, если идентификатор действителен, а идентификатор - нет. Я хочу, чтобы он вместо этого возвращал неверные идентификаторы без всех нулевых результатов.

+0

Как функция различает действительный и недопустимый идентификаторы на выходе? –

+0

@Pradeep - он возвращает 1 для действительных, 0 для недействительных. Я обновлю сообщение – froadie

+0

В этом случае ваш запрос должен работать нормально. –

ответ

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

Это работает, но возвращает нуль для всех допустимых идентификаторов

Это просто не возможно. Если вы выберете myID, вы получите myID, так что если вы получили null, значит myID должно быть null, и ваша validateID функция обнаружит, что это недействительно.

Если ваша функция должна обрабатывать null как действительный идентификатор, вам необходимо исправить вашу функцию, чтобы myDB.dbo.validateID(null) вернул 1.

Если ваша функция должна обрабатывать null как ни действительный, ни неверный идентификатор, вам необходимо исправить вашу функцию, чтобы myDB.dbo.validateID(null) вернул null.

Если функция должна относиться к null как недопустимый ID, но вы все еще хотите, чтобы исключить null результаты, когда просто добавить условие myID is not null к Вашему выбору.

+0

Спасибо, вы правы - были нулевые идентификаторы (на самом деле это не идентификатор таблицы). Спасибо, что узнал мою проблему, я чувствую себя глупо за то, что не хватает этого :) – froadie

0

Я пробовал такую ​​же логику, но получаю надлежащий выход, как ожидалось. Я получаю строки, возвращаемые только при выходе функций 0 (ie) Invalid records. Я не вижу NULL значений для 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 

ВЫВОД

id name pric 
-- ------- ----- 
1 invalid 40000 
4 invalid 40000 
Смежные вопросы