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

    −117

    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
    -- Согласная ли буква (кроме 'Ц')
     FUNCTION is_soglasn(letter IN CHAR
                      ) RETURN BOOLEAN IS
     BEGIN
      IF letter IN ('Б', 'В', 'Г', 'Д', 'Ж', 'З', 'К', 'Л', 'М', 'Н',
                    'П', 'Р', 'С', 'Т', 'Ф', 'Х', 'Ч', 'Ш', 'Щ',
                    'б','в','г','д','ж','з','к','л','м','н',
                    'п','р','с','т','ф','х','ч','ш','щ')
                     THEN
       RETURN TRUE;
      ELSE
       RETURN FALSE;
      END IF;
     END is_soglasn;

    Прислали программист организации-подрядчика... :(

    Запостил: kcapgac, 16 Февраля 2012

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

    • В принципе, я не знаю, как сделать эту же задачу по другому.
      Но почему нужно было дублировать массив для строчных и прописных вместо LOWER(letter) ... =\
      Ответить
      • Можно убрать деский сад с if ... then return true else return false;
        оставить просто return letter in...
        А ещё лучше просто завести константу soglans_set и вместо is_soglasn писать прямо letter in soglasn_set
        Ответить
        • дооо, и какого типа этот soglans_set?
          Какой тогда синтаксис у оператора in будет?
          Ответить
          • Я правильно понимаю, что в выражении из строк 05-08 есть оператор IN, который принимает слева от себя значение, справа - множество, и возвращает булевое?
            Если его нет, а есть только неразделимая конструкция if ... in ... , то извините.
            Если да, то думайте головой, прежде чем спорить.

            Отвечаю на вопросы:
            > дооо, и какого типа этот soglans_set?

            Такого же, как и выражение справа от IN

            > Какой тогда синтаксис у оператора in будет?

            Такой же, какой и был.
            Ответить
            • в pl/sql синтаксис оператора in требует, чтобы справа были скобки, а внутри них - перечисление через запятую
              в sql еще подзапрос разрешается справа (тоже в скобках)
              другие варианты использования in в качестве оператора - не знаю (как с if, так и без него)

              Множество можно устроить, но оно там - непришейкобылехвост:
              select count(1) into ret from dual 
              where letter in (
                select column_value
                from table(soglasn_set));
              return ret > 0;


              проще тогда от in отказаться:
              select count(1) into ret
              from table(soglasn_set)
              where column_value = letter;
              return ret > 0;
              Ответить
              • Ах да, в последнем запросе про rownum забыл
                select count(1) into ret
                from table(soglasn_set)
                where column_value = letter
                and rownum = 1;
                return ret > 0;
                Ответить
              • То есть то, что тут справа от IN - это не готовая константа, а тоже неразделимая часть оператора IN?
                Тогда печально, извините.
                Ответить
                • IN condition:
                  http://docs.oracle.com/cd/B19306_01/server.102/b14200/conditions013.htm#i1050801

                  IN operator:
                  http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/fundamentals.htm#sthref502
                  Ответить
                  • Судя по второй ссылке, в языке есть set, который можно описать отдельно.
                    Ответить
                    • нету, документацию индусы писали.
                      вместо set подразумевалось ('a','b','c', ...)

                      Писец, у них даже текстовое определение конфликтует с графом:
                      http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/boolean_other_expression.gif
                      http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/img_text/boolean_other_expression.htm
                      Ответить
    • Как минимум, гласных меньше
      Ответить
      • кроме гласных есть еще много символов даже в 8-битной кодировке
        Ответить
        • судя из комментария, проверяется именно буква, а не символ)
          Ответить
    • По-моему тут регулярка напрашивается:
      return regexp_like(lower(letter), '[^цуеыаоэяию]');
      Ответить
      • хотя не, либо согласные перечислить, либо добавить в начале проверку, тогда часть гласных можно не проверять:
        return lower(letter) between 'б' and 'щ' and regexp_like(lower(letter), '[^цеёийоу]');
        Ответить
    • Теперь будем умирать от любопытства, почему же буква Ц не подходит?
      Ответить
    • isSoglasna
      Ответить
    • показать все, что скрытоvanished
      Ответить

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