Microsoft SQL: СЛУЧАЙ, КОГДА по сравнению с ISNULL/NULLIF

Вам не нужно применять дневное условие, так как ваше изображение не меняет базис в день. Это меняется во времени. Таким образом, вы можете использовать что-то вроде ниже:

$h = date('H'); // it will return hour in 24 format.


if ($h >= 4 && $h < 12) $img = 'img/s1.jpg'; //if it's between 4am and 12pm show day strength 1 image
    else if ( ($h >= 12 && $h <= 23) || ($h >= 1 && $h <= 2)  ) $img = 'img/c1.jpg'; //it's between 12pm and 2am show evening condition 1 image
    else if ($h >= 2 && $h < 4) $img = 'img/rest.jpg'; //if it's between 2am and 4am show rest image

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

$h = date('H'); // it will return hour in 24 format.
$d = date('d');     
    if ($h >= 4 && $h < 12) $img = 'img/s'.$d.'.jpg'; 
    else if ( ($h >= 12 && $h <= 23) || ($h >= 1 && $h <= 2)  ) $img = 'img/c'.$d.'.jpg'; 
    else if ($h >= 2 && $h < 4) $img = 'img/rest.jpg'; 

Надеюсь, это поможет вам.

5
задан Andomar 13 May 2009 в 14:36
поделиться

6 ответов

Помните, что NULL отличается от 0. Таким образом, два фрагмента кода в вопросе могут возвращать разные результаты для одного и того же ввода.

Например, если BeginningQuantity имеет значение NULL, первое выражение оценивается как NULL:

CASE WHEN (NULL + ?)=0 THEN 0 ELSE ?/(NULL + ?) END

Теперь (NULL +?) Равно NULL, а NULL = 0 - false, поэтому предложение ELSE оценивается, давая? / (NULL +?), Что приводит к NULL. Однако второе выражение выглядит следующим образом:

ISNULL((?)/NULLIF(NULL + ?,0),0)

Здесь NULL +? становится NULL, и поскольку NULL не равно 0, NULLIF возвращает первое выражение, которое является NULL. Внешний ISNULL улавливает это и возвращает 0.

Итак, примите решение: защищаетесь ли вы от деления на ноль или деления на NULL? ; -)

8
ответ дан 13 December 2019 в 19:35
поделиться

На мой взгляд, использование Isnull / Nullif быстрее, чем использование Case When. Я предпочитаю isnull / nullif.

0
ответ дан 13 December 2019 в 19:35
поделиться

Я думаю, что в вашем примере производительность незначительна. Но в других случаях, в зависимости от сложности вашего делителя, ответ будет «зависит от обстоятельств».

Вот интересный блог по теме:

Для удобства чтения мне нравится Case / When.

3
ответ дан 13 December 2019 в 19:35
поделиться

] Я бы использовал ISNULL, но попытался бы отформатировать его так, чтобы он лучше отображал смысл:

SELECT
    x.zzz
        ,x.yyyy
        ,ISNULL(
                   EndingQuantity / NULLIF(BeginningQuantity+BAdjustedQuantity,0)
                ,0)
        ,x.aaa
    FROM xxxx...
0
ответ дан 13 December 2019 в 19:35
поделиться
CASE WHEN (coalesce(BeginningQuantity,0) + coalesce(BAdjustedQuantity,0))=0 THEN 0 ELSE coalesce(EndingQuantity,0)/(coalesce(BeginningQuantity,0) + coalesce(BAdjustedQuantity,0)) END

ваш лучший вариант imho

0
ответ дан 13 December 2019 в 19:35
поделиться

Извините, вот еще один упрощенный sql-запрос.

SELECT 

(ISNULL([k1],0) + ISNULL([k2],0)) /

CASE WHEN (
(
   CASE WHEN [k1] IS NOT NULL THEN 1 ELSE 0 END +
   CASE WHEN [k2] IS NOT NULL THEN 1 ELSE 0 END
) > 0 )
THEN
(
  CASE WHEN [k1] IS NOT NULL THEN 1 ELSE 0 END +
  CASE WHEN [k2] IS NOT NULL THEN 1 ELSE 0 END
)
ELSE 1 END

FROM dbo.[Table]
0
ответ дан 13 December 2019 в 19:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: