可移植地确定字符串是否可转换为整数

时间:2010-01-14 16:41:46

标签: sql casting portability

我想将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 个答案:

答案 0 :(得分:1)

鉴于INTEGER可接受的值范围(32位?64位?)因实现而异,因此没有非供应商特定的方法来执行此操作。

答案 1 :(得分:1)

这是名义上可移植的方法,使用ANSI SQL-99的简单伪POSIX regexen和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已经有一段时间了,FirebirdnéeInterbase在即将发布的2.5版本中承诺它,但就是这样。)