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

    −111

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    UPDATE  zayavlenie_tmp
        SET error    = 1,
            errorcod = 4
        FROM   zayavlenie_tmp
        WHERE  zayavlenie_tmp.error IS NULL
                    AND (rtrim(fam) = ''
                         OR LEN(ltrim(rtrim(fam))) < 2
                         OR fam LIKE '%0%'
                         OR fam LIKE '%1%'
                         OR fam LIKE '%2%'
                         OR fam LIKE '%3%'
                         OR fam LIKE '%4%'
                         OR fam LIKE '%5%'
                         OR fam LIKE '%6%'
                         OR fam LIKE '%7%'
                         OR fam LIKE '%8%'
                         OR fam LIKE '%9%'
    
    UPDATE  zayavlenie_tmp
        SET error    = 1,
            errorcod = 5
         FROM   zayavlenie_tmp
          WHERE  zayavlenie_tmp.error IS NULL
                    AND (rtrim(im) = ''
                         OR LEN(ltrim(rtrim(im))) < 2
                         OR im LIKE '%0%'
                         OR im LIKE '%1%'
                         OR im LIKE '%2%'
                         OR im LIKE '%3%'
                         OR im LIKE '%4%'
                         OR im LIKE '%5%'
                         OR im LIKE '%6%'
                         OR im LIKE '%7%'
                         OR im LIKE '%8%'
                         OR im LIKE '%9%'

    При импорте поля проверяются на соответствие (около 30 разнобразных правил). Хранимику писал мой начальнег :) Выкладываю УЖЕ немного исправленный для удобопонимания вариант, в исходнике таблицы еще зачем-то джойнились сами на себя. Всего в хранимике 50 (!!!) таких запросов, и каждый не менее эпичный )) Хотел исправить это хозяйство одним более-менее цивильным запросом, но где-то на половине у меня руки опустились

    Запостил: spray07, 21 Ноября 2011

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

    • А фамилии с пробелами посредине разрешены?
      А еще вопрос, ради себя интересуюсь, для расширения кругозора, ваш вариант запроса, у меня есть собственные предположения, но хотел посмотреть как правильно
      Ответить
      • > фамилии с пробелами посредине
        такие вообще бывают?
        Ответить
        • Двойные фамилии. Бывает всё, что только возможно.
          Ответить
        • Ещё бывают фамилии, в которых указана вся родословная (все имена предков), но это не в России.
          Ответить
        • Просто по условиям проверки они проходят, поэтому и спросил
          Ответить
    • Может как вариант делать эти проверки при вставке и апдейте
      Ответить
      • Конкретно в нашем случае проверки эффективней делать в этой таблице - она временная, там то что импортируем из файла. После проверок записи без ошибок перемещаются в основную таблицу.
        На счет пробела в центре я даже не заметил)) Да, их тоже быть не должно :D
        Ответить
    • плюсанём
      Ответить
    • >OR im LIKE ...
      Напомнило:
      and i'm like baby, baby, baby, oohhh
      Ответить
      • Mother, do you think they'll like this song?
        Ответить
        • Your father fucked your mother. At least once, your father and your mother were in bed, and your father got a hard-on, and he stuck it inside your mother and they fucked. Sometimes maybe your father fucked your mother in the ass, and maybe on the night that you were...
          http://tomsk.fm/watch/164947
          Ответить
    • Что думаете на счет этого варианта? Это я начал так переделывать, может и я наклал так-то?! :)

      UPDATE zayavlenie_tmp
      SET errorcod = CASE
      WHEN ltrim(rtrim(fam)) LIKE '%[0-9]%' OR LEN(ltrim(rtrim(fam))) < 2 THEN 5
      WHEN ltrim(rtrim(im)) LIKE '%[0-9]%' OR LEN(ltrim(rtrim(im))) < 2 THEN 4 ELSE NULL END;
      update zayavlenie_tmp
      set error = 1 where errorkod is not null;

      *результат этих запросов может отличаться - там присвоит первый код ошибки тут последний , но не суть важно в моем случае. и повторюсь там ~50 таких проверок еще
      Ответить
      • Не проще хранить сразу ltrim-нутые-rtrim-нутые значения?
        Ответить
    • А можно увидеть исходный вариант? Исправленный это не Ъ.
      Ответить
      • UPDATE zayavlenie_tmp
        SET error = 1,
        errorcod = 4
        FROM zayavlenie_tmp
        LEFT OUTER JOIN
        (SELECT id
        FROM zayavlenie_tmp
        WHERE zayavlenie_tmp.flk IS NULL
        AND (rtrim(fam) = ''
        OR LEN(ltrim(rtrim(fam))) < 2
        OR fam LIKE '%0%'
        OR fam LIKE '%1%'
        OR fam LIKE '%2%'
        OR fam LIKE '%3%'
        OR fam LIKE '%4%'
        OR fam LIKE '%5%'
        OR fam LIKE '%6%'
        OR fam LIKE '%7%'
        OR fam LIKE '%8%'
        OR fam LIKE '%9%')) AS flk
        ON zayavlenie_tmp.id = flk.id
        WHERE flk.id IS NOT NULL;

        Вот исходный вариант (второй запрос аналогично). Сейчас опять читаю и не могу вкурить зачем там этот джойн
        Ответить
        • Это такой способ проверки условий, насколько я понимаю.
          Ответить
    • по собственномуижеланию пиши
      Ответить
    • >errorcod
      >error
      >cod

      >>>!!!РЫБНАЯ ОШИБКА!!!<<<
      Ответить
    • ну как, подсидел начальника?
      Ответить
    • Зачем люди пишут код не являясь программистами?
      Почему не нанять программиста, и пускай у него голова болит
      Ответить

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