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

    −176

    1. 1
    and (ss_1<>'SS0001' or ss_1<>'SS0002' or ss_1<>'SS0010')

    Сегодня на продакшене было обнаружено гениальное выражение в одном из запросов.

    Запостил: mishok, 01 Июля 2015

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

    • нормальная коньюнктивная форма
      Ответить
      • А ничего страшного, что результат всегда TRUE?
        Ответить
        • Нормальная коньюктиваная форма это не потому что она нормально работает при коньюктивите, а потому, что выражение к ней нормализовали (но коньюктивные обычно не нужны, а нужны такие которые сначала переводятся в пренекс нормальную форму, потом сколемнизировануются, а потом нормализируются в дизЪюнктивную форму).
          Ответить
          • Ну да, формально тут придраться нельзя: форма действительно конЪюнктивная и действительно нормальная. Тогда и такая форма будет нормальной конъюнктивной:
            ... and (A or not A)
            Ответить
        • Почему
          Ответить
          • Либо я неточно выразился (конечно же, выражение в скобках равно TRUE, а не всё), либо ты не теряешь надежду, что какой-нибудь xSQL сравнивает строки через жопу.

            Подсказки:
            1. Вот это вменяемое выражение:
            (ss_1=='SS0001' or ss_1=='SS0002' or ss_1=='SS0010')


            2. Вот это тоже вменяемое выражение:
            (ss_1<>'SS0001' and ss_1<>'SS0002' and ss_1<>'SS0010')


            3. Вот это совершенно НЕвменяемое выражение:
            (ss_1=='SS0001' and ss_1=='SS0002' and ss_1=='SS0010')


            4. Подсказка кэпа: ss_1 не может быть одновременно равно 'SS0001' И 'SS0002' И 'SS0010', потому что в SQL (и даже в PHP, о, боже!) 'SS0001' <> 'SS0002' <> 'SS0010'.

            Хоть одно из выражений вида ss_1=='текст' должно не выполниться, если все тексты разные => хоть одно из выражений вида ss_1<>'текст' обязательно выполнится (если все тексты разные).
            Ответить
            • Да, я перепутал <> с == и and с or. Спасибо, кэп, за объемное разъяснение, хотя хватило бы и 4-го пункта!
              Ответить
        • А НИЧЕГО, ЧТО МОЙ ПАРЕНЬ РАБОТАЕТ В МАЙКРОСОФТ
          Ответить
    • Как сексуально, мм.. Возбуждает.
      Ответить
    • Надо было вместо
      cond and (ss_1<>'SS0001' or ss_1<>'SS0002' or ss_1<>'SS0010')

      написать
      (cond and ss_1<>'SS0001') or (cond and ss_1<>'SS0002') or (cond and ss_1<>'SS0010')

      Так труднее догадаться.
      Ответить
    • А есть автоматическая упрощалка булевых выражений?
      Ответить
      • Любой пакет для символьных вычислений (https://en.wikipedia.org/wiki/Category:Computer_algebra_systems).

        Да хотя бы так:
        http://www.wolframalpha.com/input/?i=s%21%3D1+or+s%21%3D2+or+s%21%3D3

        Кстати, SymPy так умеет?
        Ответить
        • P.S. Нашёл даже живую сосноль с SymPy: http://live.sympy.org/
          SymPy умеет едва ли не всё, но не умеет упрощать булевы выражения.
          Ответить
    • показать все, что скрытоvanished
      Ответить

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