我想将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上提出并回答了问题,但我想知道是否有一种或多或少的可移植方式来实现这一目标?
答案 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版本中承诺它,但就是这样。)