在Oracle,我有一个表的列(X),其可以具有这样的字符串:甲骨文:转换字符串为int
97M
101X
21E
等
我想只选择其中x> 90的整数值的那些行。在这个例子中,我希望找回包含值97M,101X和481的行。我该怎么做?
在Oracle,我有一个表的列(X),其可以具有这样的字符串:甲骨文:转换字符串为int
97M
101X
21E
等
我想只选择其中x> 90的整数值的那些行。在这个例子中,我希望找回包含值97M,101X和481的行。我该怎么做?
您可以随时使用翻译删除字母字符。
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
我用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
希望它可以帮助...
你可以尝试以下操作:
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开头还是前三位是字符串。
这些都应该是十六进制字符串?如果是这样:TO_NUMBER(x,'XXXXXXXX')> 90 – Glenn
对不起。这可能是一个坏例子。数字不以十六进制存储。我将编辑我的原始文章。 – WOPR