2024-09-21 09:29:08
WHERE
CASE WHEN REGEXP_LIKE(id,'(^[+-]?\d{0,}\.?\d{0,}$)') THEN to_number(id)
ELSE NULL END < 100;
下面是详细的说明:
你可以选择仔细看看, 也可以选择 忽略掉。
某些情况下。
存在有一个表中的某一列, 数据类型是 varchar.
其中有可能存储数字, 也有可能存储文本信息。
而当查询的时候, 有时候需要按照 数字的方式来查询。
测试表/数据如下:
CREATE TABLE test_varchar_save_num(
id varchar(10)
);
INSERT INTO test_varchar_save_num VALUES( '1');
INSERT INTO test_varchar_save_num VALUES( '15');
INSERT INTO test_varchar_save_num VALUES( '20');
INSERT INTO test_varchar_save_num VALUES( '50');
INSERT INTO test_varchar_save_num VALUES( '1B');
INSERT INTO test_varchar_save_num VALUES( '2A');
INSERT INTO test_varchar_save_num VALUES( '1 ');
INSERT INTO test_varchar_save_num VALUES( '2 ');
INSERT INTO test_varchar_save_num VALUES( ' 1');
INSERT INTO test_varchar_save_num VALUES( ' 2');
INSERT INTO test_varchar_save_num VALUES( 'ABC');
要求查询 id 范围, 在 10~30 之间的数据.
无视数据类型的写法. (ORA-01722: 无效数字)
SELECT
*
FROM
test_varchar_save_num
WHERE
id BETWEEN 10 AND 30;
ERROR:
ORA-01722: 无效数字
数字参数修改为 varchar 的写法. (结果数据不正确)
SELECT
*
FROM
test_varchar_save_num
WHERE
id BETWEEN '10' AND '30';
ID
--------------------
15
20
1B
2A
2
使用正则表达式 + to_number 的写法(ORA-01722: 无效数字)
SELECT
*
FROM
test_varchar_save_num
WHERE
REGEXP_LIKE(id,'(^[+-]?\d{0,}\.?\d{0,}$)')
AND to_number(id) BETWEEN 10 AND 30;
ERROR:
ORA-01722: 无效数字
使用 正则表达式子查询 + 主查询 to_number 的写法(ORA-01722: 无效数字)
SELECT
*
FROM
(
SELECT
*
FROM
test_varchar_save_num
WHERE
REGEXP_LIKE(id,'(^[+-]?\d{0,}\.?\d{0,}$)')
) subQuery
WHERE
to_number(id) BETWEEN 10 AND 30;
ERROR:
ORA-01722: 无效数字
使用 case when , 将非数字的,转化为 null 的写法 (完成处理)
SELECT
*
FROM
test_varchar_save_num
WHERE
CASE WHEN REGEXP_LIKE(id,'(^[+-]?\d{0,}\.?\d{0,}$)') THEN to_number(id)
ELSE NULL END BETWEEN 10 AND 30;
ID
--------------------
15
20
2024-09-21 09:43:41
2024-09-21 04:16:24
报无效数字 你试过没
无效数字是因为你那里里有存在不是数字的东西
---------------------------
以上是当插入的数据都是数字的字符时,大小都是按照正常数字来比较的
当我插入了一条非数字型字符
首先id<100无法直接进行比较,会报无效数字的错,因为当有非数字字符插入时,所有的数字的字符都不会隐性转成数字了,所以导致后边的大小比较时只有1被选出来
开始你也没说里边有非数字的字符,所以肯定用to_number就可以了
你这个貌似只能把非数字的字符都屏蔽掉,然后用to_number做比较
不好意思 确实有条非数字的数据 那怎么办 我查了下to_number不能过滤啊
查下那个非数字的字符,比如那个字符叫'a123'
where id'a123' and to_number(id)<100
这个真的不行 我之前就试过了 to_number不能过滤有非数字的那列
比如表名t,那个字符还是叫'a123'
select * from
(select * from t where id<>'a123') t1
where to_number(id)<100
这样真可以,我刚试了