1с ошибка sql деление 0

Обновлено: 04.07.2024

Msg 8134, Уровень 16, Состояние 1, Строка 1 При обнаружении ошибки деления на ноль.

Я мог бы сделать одно из следующего:

  • Добавьте предложение where, чтобы мой делитель никогда не был равен нулю
  • Я мог бы добавить описание случая, чтобы был специальный режим для нуля.

Это лучший способ использовать NULLIF предложение?

Есть ли лучший способ, или как это можно осуществить?

Чтобы избежать ошибки «Деление на ноль», мы запрограммировали ее так:

Но вот гораздо лучший способ сделать это:

Теперь единственная проблема - вспомнить бит NullIf, если я использую клавишу "/".

Гораздо более приятный способ сделать это «Выбрать делимое / ноль, если делитель равен NULL. @ Андерсон Это совсем не так. Вы уверены, что случайно не использовали IsNull вместо NullIf ? Попробуй сам! SELECT Value,1/NullIf(Value,0)FROM(VALUES(0),(5.0),(NULL))x(Value); Если вы не имеете в виду "breaks", вы подразумеваете, что возвращает NULL? Вы можете преобразовать это в то, что вы хотите с помощью IsNull или Coalesce . @ErikE, это правда . попробуйте запустить . select 1 / nullif (null, 0) . you get "Тип первого аргумента для NULLIF не может быть константой NULL, поскольку тип первого аргумента имеет быть известным. " Обработайте это с помощью "coalesce (FieldName, 0)" . например, выберите 1 / nullif (coalesce (null, 0), 0) @JohnJoseph Я не могу сказать, согласны ли вы со мной или спорите со мной. @JohnJoseph Посмотрите ближе на ошибку, которую вы получили. Да, SELECT 1 / NULLIF(NULL, 0) не удается, но это потому, что NULLIF() нужно знать тип данных первого аргумента. Это измененный пример работает нормально: SELECT 1 / NULLIF(CAST(NULL AS INT), 0) . В реальной жизни вы собираетесь указывать столбец таблицы, NULLIF() а не NULL константу. Поскольку столбцы таблицы имеют известные типы данных, это также работает отлично: SELECT 1 / NULLIF(SomeNullableColumn, 0) FROM SomeTable .

Если вы хотите вернуть ноль, в случае возникновения нулевого отклонения, вы можете использовать:

Для каждого делителя, равного нулю, вы получите ноль в наборе результатов.

Некоторые тесты показывают, что COALESCE немного медленнее, чем ISNULL. Тем не менее, COALESCE в стандартах, поэтому является более портативным. Если кто-то еще не сразу понял, почему это работает, NULLIF (d, 0) вернет NULL, если d равно 0. В SQL деление на NULL возвращает NULL. Объединение заменяет полученное значение NULL на 0. @SQLGeorge Хотя я согласен с вашим аргументом, обратите внимание, что есть случаи, когда нас интересует, что статистически правильно, а не математически правильно. В некоторых случаях при использовании статистических функций 0 или даже 1 является приемлемым результатом, когда делитель равен нулю. Может кто-нибудь объяснить мне, почему это плохо? Если я пытаюсь вычислить процент, а делитель равен нулю, я, безусловно, хочу, чтобы результат был равен нулю. Я думаю, что @ Джордж и @ Джеймс / Уилсон в корне неправильно понимают задаваемый вопрос. Конечно, существуют бизнес-приложения, в которых возвращение «0» является уместным, даже если это технически неверно с математической точки зрения.

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

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

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

Перепишите запрос как:

Любое число, разделенное на число, NULL дает NULL ошибку.

Да, действительно, это ПУТЬ ЛУЧШЕ, чем тот другой ответ, который получил так много голосов. В вашем решении у вас есть по крайней мере NULL, что означает, что вы не можете предоставить правильный результат. Но если вы конвертируете результат из NULL в ноль, то вы просто получите неправильные и вводящие в заблуждение результаты. Кстати, если вы хотите , чтобы вычислить / женское соотношение мужчин, то я предлагаю , чтобы лучше сравнить его с общим, как это: select males/(males+females), females/(males+females) . Это даст вам процентное соотношение мужчин и женщин в клубе, например, 31% мужчин, 69% женщин.

Вы также можете сделать это в начале запроса:

Так что если у вас есть что-то подобное, 100/0 он вернет NULL. Я сделал это только для простых запросов, поэтому я не знаю, как это повлияет на более длинные / сложные запросы.

Работает для меня. В моем случае я должен использовать операцию деления в предложении WHERE. Я уверен, что нет делителя нуля, потому что, когда я комментирую ГДЕ, в результатах нет нулевых значений. Но каким-то образом оптимизатор запросов делит на ноль при фильтрации. SET ARITHABORT OFF и SET ANSI_WARNINGS OFF делают это - после 2 дней борьбы с делением на ноль в предложении WHERE. Спасибо! Это "чувствует" так грязно, но я люблю это! Это было необходимо в запросе, который выполняет агрегацию и использование оператора CASE, но это не вариант, потому что тогда мне пришлось добавить этот столбец в GROUP BY, что полностью изменило результаты. Сделав начальный запрос подвыбором, а затем выполнив GROUP BY для внешнего запроса, также изменятся результаты, так как в нем задействовано деление. Итак, мне все еще нравится это «решение», но, как многие из вас, вероятно, чувствовали, я чувствовал, что должен быть «более чистый» способ. Что если я забыл снова включить предупреждения? Или кто-то скрыл мой код (этого никогда не происходит, верно?) И не подумал о предупреждениях? Во всяком случае, видел другие ответы о NULLIF (). Я знал о NULLIF (), но не понимал, что деление на NULL возвращает NULL (я думал, что это будет ошибкой). Итак . Я пошел со следующим: ISNULL ((SUM (foo) / NULLIF (SUM (bar), 0)), 0) AS Avg Я не знал этого решения. Я не уверен, что мне это нравится, но это может быть полезно знать когда-нибудь. Большое спасибо.

Вы можете, по крайней мере, остановить прерывание запроса с ошибкой и вернуть, NULL если есть деление на ноль:

Тем не менее, я бы НИКОГДА не конвертировал это в ноль, coalesce как показано в другом ответе, получившем много голосов. Это совершенно неверно в математическом смысле и даже опасно, поскольку ваше приложение, скорее всего, даст неверные и вводящие в заблуждение результаты.

ОТВЕТ: Я думаю, что здесь есть основная проблема, которая заключается в том, что деление на 0 не является законным. Это признак того, что что-то в корне неправильно. Если вы делите на ноль, вы пытаетесь сделать что-то, что не имеет смысла математически, поэтому никакой числовой ответ, который вы можете получить, не будет действительным. (Использование null в этом случае является разумным, поскольку это не значение, которое будет использоваться в последующих математических вычислениях).

Таким образом, Эдвардо спрашивает в комментариях «что если пользователь введет 0?», И он настаивает на том, что все должно быть в порядке, чтобы получить 0 взамен. Если пользователь помещает ноль в сумму, и вы хотите, чтобы 0 возвращалось, когда они это делают, то вам нужно вставить код на уровне бизнес-правил, чтобы перехватить это значение и вернуть 0 . не должно быть какого-то особого случая, когда деление на 0 = 0.

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

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

Читайте также: