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

    −117

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    Чудеса от Oracle. 
    
    --------- работает: 
    select to_number(null) from dual union all
    select to_char(null)       from dual
    
    ------------- меняем строчки местами - не работает
    select to_char(null)       from dual union all
    select to_number(null) from dual

    Null - это чудо расчудесное, что на дереве растет. Кто его увидит, тот от ужаса замрёт.

    Запостил: dim1r, 02 Ноября 2012

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

    • М.б. дело в том, что char можно откастить в number, а вот number в char - проблематично.
      Ответить
      • здравая мысль. Как вариант можно проверить, что реально возвращает запрос - строку или цифры.
        Ответить
        • Думаю всё как обычно, из-за неявных преобразований.
          Ответить
      • в том то и дело, что наоборот : number --> char нет проблем (1234 --> '1234'),
        а вот char --> number - не всегда удается ('xyz' --> ??? )
        Ответить
        • Ничего подобного.
          Результат обычно преобразуется к тому что уже было перед union.
          В рабочем варианте первый операнд - number вот к нему по логике и должно конвертироваться.
          Ответить
          • да ну ? Впервые встречаюсь с тем, что строку в число можно перевести, а вот число в строку - нельзя. Обычно все наоборот.
            Может оракл приведение типов начинает с последнего sql в union?
            Ответить
            • Возможно. Ща проверим.
              У меня как и предполагалось отваливается именно второе. С таким посланием.
              [Oracle][ODBC][Ora]ORA-01790: 
              expression must have same datatype as corresponding expression (SQL-HY000)
              Ответить
              • а вот такое работает :
                select to_char(null) from dual union all
                select to_number(null) from dual union all
                select to_char(null) from dual

                и такое
                select to_number(null) from dual union all
                select to_number(null) from dual union all
                select to_char(null) from dual


                не работает только когда to_number в конце стоит
                Ответить
                • Да. Оба работают. Хм. Во говнище.
                  Ответить
                  • Надо как-то запилить сайт годнокод.ру
                    Ответить
                  • Хотелось бы посмотреть на планы всех этих запросов, может тогда и узнаем причину столь странного поведения.
                    Ответить
            • А Вот на MS-SQL ни так, ни сяк не желает. Грит не дам тебе сделать Implicit conversion и край.
              Ответить
    • В DB2 какой-то конкретной версии была тоже интересная фигня с юнионами. Кажется, там если последняя строка юниона (или произвольная) не возвращала результата, запрос падал. Достаточно было написать в условии 1=2 и всё, приехали. Как было установлено дальше, оно умудрялось возвращать в таком случае запись с полями, полными нуллов, даже если поля были константами. Грубо говоря, select 1, 2, 3 from SYSIBM.SYSDUMMY1 where 1=2 возвращало <NULL, NULL>.
      Ответить
      • Много интересной херни с юнионами.
        Вот например брать и неявно использовать их для сортировки - надо найти тот запрос и положить отдельным постом.
        Нигде ведь в стандартах такого не написано. Просто побочный эффект.
        То же, ясное дело, касается также distinct и group by.
        Ответить
    • О, сколько нам открытий чудных готовит игнорирование документации!

      У Oracle же в доке яснее некуда "в запросах использующих set операторы, Oracle не выполняет неявных преобразование между типами данных".

      А SELECT to_lob(NULL) FROM dual считает что NULL имеет тип CHAR (в одной из версий).
      Ну и что?
      Это неправильное использование to_lob (она может быть применена только к LONG и LONG RAW столбцам).
      Ответить

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