Поясняющий, может ли строка быть приведена к целому числу - PullRequest
4 голосов
/ 14 января 2010

Я бы хотел привести VARCHAR к SQL INTEGER, предоставив значение по умолчанию, если какое-либо значение в поле не будет преобразовано должным образом. Что-то вроде:

sql> SELECT str FROM tbl;  -- CREATE TABLE tbl (str VARCHAR(12), ...)
    str
========
  12345
     -1
    foo

sql> SELECT CAST((CASE WHEN ... THEN str ELSE '-9999' END) AS INTEGER) AS "int" FROM tbl;
    int
========
  12345
     -1
  -9999

Что я мог бы вставить в многоточие выше, чтобы получить желаемые результаты?

Этот вопрос задавался и отвечался на SO для многих конкретных БД, но мне интересно, есть ли более или менее портативный способ для достижения этой цели?

Ответы [ 2 ]

1 голос
/ 15 января 2010

Вот номинально переносимый подход, использующий простое псевдопозикритическое регулярное выражение ANSI SQL-99 с оператором SIMILAR TO:

CAST ((CASE
       WHEN string_column -- in perl:  $string_column =~ /^\s*[+-]?\d+\s*$/
            SIMILAR TO
            '[[:space:]]*([+-]|)[[:digit:]]+[[:space:]]*'
       THEN
         string_column
       ELSE
         '-9999'         -- default value for un-CASTable strings
       END)
      AS INTEGER

Я говорю «номинально переносимый», потому что SIMILAR TO широко не поддерживается. (У PostgreSQL это уже давно есть, Firebird, урожденная Interbase, обещает это в следующем выпуске 2.5, но это все.)

1 голос
/ 14 января 2010

Учитывая, что диапазон значений acceptbale для INTEGER (32 бита? 64 бита?) Варьируется от реализации к реализации, не существует способа, не зависящего от поставщика.

...