2012-06-20 90 views
1

在Oracle,我有一个表的列(X),其可以具有这样的字符串:甲骨文:转换字符串为int

97M
101X
21E

我想只选择其中x> 90的整数值的那些行。在这个例子中,我希望找回包含值97M,101X和481的行。我该怎么做?

+0

这些都应该是十六进制字符串?如果是这样:TO_NUMBER(x,'XXXXXXXX')> 90 – Glenn

+0

对不起。这可能是一个坏例子。数字不以十六进制存储。我将编辑我的原始文章。 – WOPR

回答

2

您可以随时使用翻译删除字母字符。

TO_NUMBER(translate('90F', '1ABCDEFGHIJKLMNOPQRSTUFWXYZ', '1')) -- = 90 

翻译确实在第二个参数中的字符在第三个参数的字符1对1的转换。

下面是一个不同的例子。

translate('ABCDEFG', 'ABC', 'XYZ') = 'XYZDEFG' 

A -> X 
B -> Y 
C -> Z 

现在,如果你看一下我的例子

translate('90F', '1ABCDEFGHIJKLMNOPQRSTUFWXYZ', '1') 

1 -> 1 (this is here because if that last argument is null, you'll get an empty string) 
A -> ? there's nothing here, so oracle will translate it to nothing 
B -> same as above 
+0

我喜欢这个,但我有点困惑:不应该翻译'90F'翻译成901,用'1'代替F? – WOPR

+0

@ user1059096没有。我会编辑我的帖子来解释'translate'多一点。 – climbage

+0

明白了。感谢您的解释。 – WOPR

6

我用REGEXP_REPLACE使用TO_NUMBER之前删除字母字符,以便根据需要,我可以筛选结果:

WITH t 
    AS (SELECT '97F' AS x FROM DUAL 
     UNION 
     SELECT '481' FROM dual 
     UNION 
     SELECT '101A' FROM dual 
     UNION 
     SELECT '101A' FROM dual 
     UNION 
     SELECT '88' FROM dual 
     UNION 
     SELECT '21E' FROM dual) 
SELECT x 
    FROM t 
WHERE TO_NUMBER(regexp_replace(x, '[[:alpha:]]', '')) > 90; 

X 
101A 
481 
97F 

希望它可以帮助...

+0

我最喜欢这个,但我想知道一个像'88a1'这样的字符串,以及这是否真的合格。 – Glenn

+1

足够OP,但如果有人想测试'45A2'的第一个数字,我建议'to_number(regexp_substr(x,'^ \ d *'))' – Aprillion

+0

@deathApril,我同意你的看法。但是,对于课程的马,OP给出的数据看起来相当简单,没有数字之间的字母实例。我不想过度复杂。 – Ollie

0

你可以尝试以下操作:

WHERE (substr(x, 1, 1) = '9' and substr(x, 2, 1) between '1' and '9' 
    ) or 
     (substr(x, 1, 1) between '1' and '9' and 
     substr(x, 2, 1) between '0' and '9' and 
     substr(x, 3, 1) between '0' and '9' 
    ) 

这有点蛮力。它会检查字符串是以91-99开头还是前三位是字符串。