Мне нужно загрузить некоторые тестовые данные в поле «Канал» в моей учетной записи. Канал может быть один из 10 различных значений, так что я думал, что я случайно назначить канал одного из значений, используя выражение CASE
вместе с ABS(CHECKSUM(NewId())) % 10
так:Как это выражение CASE достигает предложения ELSE?
SELECT
id,
name,
Channel =
CASE ABS(CHECKSUM(NewId())) % 10
WHEN 0 THEN 'Baby Only'
WHEN 1 THEN 'Club'
WHEN 2 THEN 'Drug'
WHEN 3 THEN 'Food'
WHEN 4 THEN 'Internet'
WHEN 5 THEN 'Liquidators'
WHEN 6 THEN 'Mass'
WHEN 7 THEN 'Military'
WHEN 8 THEN 'Other'
WHEN 9 THEN 'Speciality'
ELSE '*NONE*' -- How is this ever getting reached?
END
FROM
retailshelf_nil...account A
Поскольку я использую по модулю 10, я думал единственные возможные значения должны быть 0-9. Но когда я запускаю код выше, я нахожу, что положение ELSE
действительно было достигнуто и что мои данные придумывают «NONE» на некоторых записях, как показано ниже:
id name Channel
001L000000KpgFqIAJ Acct1 *NONE*
001L000000KpgFrIAJ Acct2 Mass
001L000000KpgFsIAJ Acct3 Club
001L000000KpgFtIAJ Acct4 *NONE*
001L000000KpgFuIAJ Acct5 Baby Only
001L000000KpgFvIAJ Acct6 *NONE*
001L000000KpgFwIAJ Acct7 Mass
Может кто-то пожалуйста, объясните, что логическая ошибка, которую я сделал, что позволяет сделать предложение ELSE?
Когда я бегу простой тест, чтобы просто генерировать случайное число, как так:
SELECT
RadomNum = ABS(CHECKSUM(NewId())) % 10
FROM
retailshelf_nil...account A
ORDER BY
1
Все номера сгенерированных являются 0-9, как и ожидалось, так что по-другому об этом первый SQL?
И есть ли обходной путь, чтобы гарантировать, что ELSE
так и не был достигнут?
Когда 'ABS (CHECKSUM (NewId()))' возвращает NULL, ELSE будет исполнять. Это произойдет, когда NewId() вернет NULL. – DwB
@ DwB, спасибо за ваш ответ, но почему NEWID() когда-нибудь вернет NULL? – PaulStock
Если вы просто ищете случайное значение, и вы получаете значения, выходящие иначе, чем другие, почему бы просто не перевернуться еще на одну из ваших других ценностей, так что иначе было бы «Specialty», а также 9, уверен, что это может испортить но это не имеет значения. – Phaeze