2009-04-10 2 views
2

У меня есть таблица с данными измерений в SQL Server 2005, по одному значению на человека и год, если она доступна. Мой TSQL код извлекает эти значения в цикле и обрабатывает их:Дифференцировать пустое из результатов запроса NULL

... 
SET @val = (SELECT measurement FROM tbl_data WHERE persid = @curpersid AND yr = @curyear) 
... 

Теперь, для определенного человека и года, таблица может содержать (I) действительное измерение, (б) значение NULL или (III) никакой соответствующей строки вообще.

Как эффективно дифференцировать эти случаи? И (II) и (III) приведет к @val бытийного NULL, поэтому с текущим кодом, они не могут быть дифференцированы ...

Благодаря кучу для каких-либо намеков, wwwald

ответ

0

Ну, это немного рубить, но:

SET @val = -99999 -- or some other value that will never occur in the table 
SELECT @val = measurement FROM tbl_data WHERE persid = @curpersid AND yr = @curyear 

Теперь, если @val все еще -9999, тогда не было строки или нуля, если измерение было нулевым.

+0

Спасибо, решение COALESCE кажется оптимальным для меня. Это также позволяет мне использовать SET, который будет предупреждать меня, когда возвращаются несколько строк ... – wwwald

1

Возможно проверить @@ROWCOUNT ? Тем не менее, это немного рискованно, так как вы должны быть уверены, что не выполняете никаких других операций, прежде чем вы проверите @@ROWCOUNT (он обновляется после большинства операций).

В качестве альтернативы, прочитайте еще один столбец, как первичный ключ:

SELECT @val = measurement, @id = id 
FROM tbl_data WHERE persid = @curpersid AND yr = @curyear 

@id теперь проверяют - если NULL, не было ни в одной строке.

+0

Я предпочитаю избегать @@ ROWCOUNT, чтобы сделать код более надежным. Если кто-то вставит запрос между ними, все это сломается. – wwwald

+0

Я считаю, что я сделал это и предложил более безопасный вариант? –

+0

Да, определенно. Я, вероятно, подойду для опции COALESCE (см. Ниже), так как это позволяет мне продолжать использовать SET. Спасибо за идею, в любом случае! – wwwald

2

Если вы можете использовать значение, которое невозможно измерить, COALESCE() может использоваться.

SET @val = (SELECT COALESCE(measurement, someValueThatDoesNotOccur) FROM tbl_data WHERE persid = @curpersid AND yr = @curyear) 

Нет строки: @val == NULL

измерение NULL: @val равно SomeValue

еще измерение vlaid

1

Я сомневаюсь, почему вы вообще зацикливаетесь? Looping - это плохо в SQL Server, так как это убийца производительности. Большинство вещей имеют лучшее решение на основе набора. Возможно, ваша проблема имеет лучшее решение, если вы сообщите нам, что вы делаете в цикле, помимо установки значения переменной.

Смежные вопросы