Замена часто используемого сложного теста в SQL Server Query на Function - PullRequest
3 голосов
/ 13 марта 2012

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

where (pvp.code between '99201' and '99215'
    or pvp.code between '99221' and '99239')

плюс еще куча других диапазонов.

Я пытался создать функцию, просто подключив ее к функции, но я получил ошибку «неправильного синтаксиса» - на самом деле, это не удивительно.

CREATE FUNCTION IsEncounter 
(
    @code varchar(20)
)
RETURNS bit
AS
BEGIN
    DECLARE @Result bit;

    SELECT @Result = @code between '99201' and '99215'
            or @code between '99221' and '99239';

    -- Return the result of the function
    RETURN @Result;

END

Полагаю, я могу сделать что-то вроде

if (@code >= '99201' and @code <= '99215')
        or (@code >= '99221' and @code <= '99239')
    select @Result = 1
else
    select @Result = 0;

но я бы хотел знать самый чистый способ сделать это. Спасибо.

Ответы [ 3 ]

4 голосов
/ 13 марта 2012

Примерно так должно работать:

CREATE FUNCTION IsEncounter 
(
   @code varchar(20)
)
RETURNS bit
AS
BEGIN
    DECLARE @Result bit

    SET @Result = CASE WHEN (@code between '99201' and '99215') or (@code between '99221' and '99239') THEN 1 ELSE 0 END

    RETURN @Result
END
3 голосов
/ 13 марта 2012

Я думаю, что вы почти правы со своим UDF.Я думаю, что есть только несколько синтаксических проблем.Попробуйте следующее:

CREATE FUNCTION IsEncounter 
(
    @code varchar(20)
)
RETURNS bit
AS
BEGIN
    DECLARE @Result bit = 0

    IF @code between '99201' and '99215' or @code between '99221' and '99239'
    BEGIN
        SET @Result = 1
    END

    RETURN @Result

END

Тогда ваше предложение WHERE будет просто:

where dbo.IsEncounter(p.Code)=1
1 голос
/ 13 марта 2012

Я бы переместил свои диапазоны в таблицу и затем сделал бы это:

CREATE FUNCTION IsEncounter ( @code VARCHAR(20) )
RETURNS BIT
AS 
    BEGIN 
        DECLARE @MatchedRanges SMALLINT ;
        DECLARE @Result BIT ;

        SELECT  @MatchedRanges = COUNT(*)
        FROM    tblRangeWhiteList
        WHERE   @code BETWEEN RangeStart AND RangeEnd

        IF @MatchedRanges > 0 
            SET @Result = 1
        ELSE 
            SET @Result = 0

        RETURN @Result 

    END 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...