Как получить значение из столбца NULL? - PullRequest
0 голосов
/ 21 декабря 2018

Как я могу изменить эту хранимую процедуру, чтобы она также возвращала строки со значениями столбца NULL?

    @title VARCHAR(50) NULL,
    @initials VARCHAR(100) NULL,
    @surname VARCHAR(100) NULL, 
AS
BEGIN
    SELECT 
        ID, MEMBERSHIP_ID, TITLE, INITIALS, SURNAME, 
    FROM
        MEMBERSHIP_DTLS 
    WHERE 
        TITLE = (CASE WHEN @title IS NULL THEN (TITLE) ELSE @title END)
        AND INITIALS = (CASE WHEN @initials IS NULL THEN INITIALS ELSE @initials END )
        AND SURNAME = (CASE WHEN @surname IS NULL THEN SURNAME ELSE @surname END)
END
GO

Что я пытаюсь сделать здесь, это то, что если в процедуру передается параметр NULL, то результатывозвращенный не будет отфильтрован этим параметром, поэтому, если все параметры были нулевыми, то все в этой таблице возвращается.

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

Ответы [ 4 ]

0 голосов
/ 21 декабря 2018

Можно также попробовать следующий способ проверки и сопоставления значений столбцов с передачей значений переменных.

Описание дано в комментариях ниже.

create table #StudentInfo (StudentId int identity(1,1), StudentName char(1))
insert into #StudentInfo values ('A'),( 'B'), ('C'), ('D'), ('E'), (NULL)

declare @StudentNameToSearch varchar(1)
select @StudentNameToSearch = NULL

--To return all student if @StudentNameToSearch is NULL
select * from #StudentInfo where StudentName = @StudentNameToSearch OR @StudentNameToSearch IS NULL

--To return only student of NULL value if @StudentNameToSearch is matched and IS NULL
select * from #StudentInfo where ISNULL(StudentName,'') = ISNULL(@StudentNameToSearch,'')

--To return only student if @StudentNameToSearch is matched and not null
select @StudentNameToSearch = 'B'
select * from #StudentInfo where ISNULL(StudentName,'') = ISNULL(@StudentNameToSearch,'')

Вывод такой, как показано ниже

enter image description here

0 голосов
/ 21 декабря 2018

Вы можете использовать ISNULL для краткости.Это вернет NULLS и значения, соответствующие @title, когда есть значение, иначе все записи будут возвращены.

AND (@title IS NULL OR TITLE=@title)
0 голосов
/ 21 декабря 2018

Я изменил ваш запрос для обработки нулевого значения параметра.проверьте пожалуйста

SELECT M.ID, M.MEMBERSHIP_ID, M.TITLE , M.INITIALS, M.SURNAME, 
FROM MEMBERSHIP_DTLS M 
WHERE (@title IS NULL OR TITLE = @title)
  AND (@initials IS NULL or INITIALS = @initials )
  AND (@surname IS NULL OR SURNAME = @surname  );

если @title равен NULL, я не хочу, чтобы он возвращал значения NULL

Попробуйте

((@title IS NULL AND TITLE IS NOT NULL) OR TITLE = @title)
0 голосов
/ 21 декабря 2018

Я считаю, что логика, которую вы хотите, это:

WHERE (TITLE = @title OR @title IS NULL) AND
      (INITIALS = @initials OR @initials IS NULL) AND
      (SURNAME = @surname OR @surname IS NULL)
...