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

    −864.2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    select to_char(null) from dual  
    union
    select to_number(null) from dual
    
    ORA-01790:	expression must have same datatype as corresponding expression

    Когда смотришь на пустую чашку, то можно сказать, что в ней нет, например, чая или ,например, нет кофе. Но нельзя сказать, что в нет ни чая ни кофе.

    Запостил: dim1r, 16 Ноября 2009

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

    • лопух
      Ответить
    • dim1r, вот скажи, что быстрее: преобразовывать находу типы данных или решать сразу на этапе парсинга?
      Ответить
      • в смысле? - что быстрее написать или что быстрее работает ?
        Ответить
        • быстрее работает
          Ответить
          • а как это, по Вашему, решается на этапе парсинга?
            Ответить
            • Можно на ты.
              Тут оракл не этапе разбора запроса определяет тип столбца. И ораклу нужно, чтобы везде в этом столбце этот тип был.
              С одной стороны это ведет к тому, что запросы будут выполняться быстрее (не будет преобразования типов находу).

              С другой стороны это защищает от ошибок, а то если у программиста один запрос возвращает строку букв, а другой - числа, то надо предупредить его, может он ошибается.
              Ответить
              • Не запрос ошибается, а программист :-)
                Ответить
              • Всякие парсеры делают неявные приведение типов. Если столбец типа varchar, а сравниваешь его с числом (select....where str=1), то неявное приведение столбца будет идти к типу number. А если где-то значение str 'AAA', то тогда будет ошибка.


                with SampleData as(
                select '1' N from dual
                union select '01' from dual
                )
                select * from SampleData where N=1
                Ответить
                • Я тут подумал, ораклу надо, чтобы был всегда определенный тип. Может это такая защита от ошибок программистов.
                  Ответить
                  • в смысле? каждый раз писать
                    number(1) varchar('A') ?
                    Ответить
                    • нет, я к тому что
                      как я понял, в скуэльных запросах в Оракле число может рассматриваться как строка, строка из цифр - как число.

                      Пример:
                      Во вложенном запросе столбец содержит число, во внешнем с этим столбцом обращаются как-будто там строка.

                      Но не может быть, похоже, такого, чтобы на одном уровне (например на уровне вложенного запроса) столбец двояко рассматривался.
                      Ответить

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