1. SQL / Говнокод #6084

    −863

    1. 1
    2. 2
    3. 3
    WHERE (p.city_id = 1)
       AND ((COALESCE(b.banket_persons,0)=0) OR (b.banket_persons>=20 AND b.banket_persons<=30))
       AND ((COALESCE(b.banket_per_person,0)=0) OR (b.banket_per_person>=500 AND b.banket_per_person<=1000))

    упорный программер явно не подозревал о существовании "is null" и "between"

    Запостил: NaCilnic, 24 Марта 2011

    Комментарии (5) RSS

    • > упорный программер явно не подозревал о существовании "is null"

      прошу заметить, что `COALESCE(b.banket_persons,0)=0` будет TRUE также когда `b.banket_persons=0`, а не только тогда когда `b.banket_persons is null`

      ну а between это да. есть народ которому between просто не нравится. и т.к. он есть синтаксические подсластитель, то имо его неиспользование не так уж и страшно.
      Ответить
      • Полагаю, ТС имел в виду функцию ISNULL, которая суть COALESCE для двух аргументов, а не сравнение "%variablename% IS NULL".
        Ответить
        • Проблема в том, что при использовании COALESCE для полей b.banket_persons и b.banket_per_person уже вряд ли будут работать индексы, если они ранее были определены.
          Ответить
    • Сталкнулся с такой ситуцией:
      В процедуре был запрос с between, после 3 лет без проблемной работы процедура стала выполнятся 30 секунд (between перестал использовать индекс)
      после того как запрос был исправлен на <=, >= индекс стал использоватся.
      Ответить
    • COALESCE(b.banket_persons,0)=0

      Нормальный код, если нужно считать, что значение по умолчанию - 0.
      is null тут вообще не в тему. Единственная проблема - с индексами, но это уже зависит от распределения данных в БД, так на вскидку сказать нельзя, требуется ему оптимизация или нет. Нормальный код, в целом.
      Ответить

    Добавить комментарий