检查号码问题

时间:2009-07-12 22:54:01

标签: sql oracle

我在payment_line表(Oracle)中有一个名为check_num(银行支票号)的列为VARCHAR2类型。

要求是“我必须搜索所有那些数字大于12345的支票。

请建议我如何实现这一目标?

5 个答案:

答案 0 :(得分:2)

最有可能是更优雅的解决方案,但这应该可以解决问题:

SELECT * 
FROM payment_line pl 
WHERE LENGTH(TRIM(TRANSLATE(pl.check_num, '0123456789',' '))) IS NULL 
   AND TRIM(TRANSLATE(pl.check_num, '0123456789','0123456789')) > 12345;

修改

如果我理解您对Adam Paynter的评论,请输入:

0A132 
1A117 
2A123 
12D24 
02134 
11111 
12345 
21334 

并且您使用1A117作为比较,结果集将是:

2A123 
12D24 
02134 
11111 
12345 
21334

您能否确认0213411111都应该在此结果集中?它们似乎不符合> 1A117这样的值的要求。但是,如果这是一个拼写错误,您实际上可以运行一个简单的字符串比较来获取此设置:

SELECT * 
FROM payment_line pl
WHERE pl.check_num > '1A117';

编辑2

好的,我想我知道你要去哪里了。您希望获取在输入行之后输入的db中的行。如果您查看上面的格式化列表,您将看到结果集是输入字符串下面的所有内容。因此,考虑到这一点,我提交以下的批准:

SELECT * 
FROM payment_line  
WHERE rowid > (select rowid from payment_line where check_num ='1A117');

答案 1 :(得分:1)

不幸的是,Oracle不提供诸如IS_INTEGER(...)之类的便利功能,否则您可能会执行以下查询:

-- Fictional, though desirable, query:
SELECT *
FROM  checks
WHERE IS_INTEGER(check_num) AND TO_NUMBER(check_num) > 12345

但是,有一种方法可以模拟这样的功能:

-- Real, though less-than-desirable, query:
SELECT *
FROM  checks
WHERE TRIM(TRANSLATE(check_num, '0123456789', '          ')) IS NULL
  AND TO_NUMBER(check_num) > 12345

TRANSLATE(check_num, '0123456789', ' ')调用用空格替换check_num内的每个数字。例如:

 check_num          TRANSLATE(check_num, '0123456789', '          ')
---------------------------------------------------------------------
 '12345'            '     '
 'cat'              'cat'
 '123cat45'         '   cat  '

因此,如果check_num包含数字,则TRIM(TRANSLATE(check_num, '0123456789', ' '))将为NULL(即空字符串)。

答案 2 :(得分:0)

我希望以下内容可以帮助您 -

select * from checkTable where TO_NUMBER(check_num) > 12345;

欢呼声

答案 3 :(得分:0)

在此要求中使用to_number()很棘手,因为强制Oracle在应用TO_NUMBER函数之前应用检查值是否安全转换为数字并不容易,并且可能会出现ORA-01722错误未来。

我想我会:

SELECT * 
FROM payment_line pl 
WHERE LENGTH(TRIM(TRANSLATE(pl.check_num, '0123456789',' '))) IS NULL 
   AND LPAD(pl.check_num,10,'0') > TO_CHAR(12345,'fm0000000000');

您可能会要求在LPAD(pl.check_num,10,'0')上创建索引来帮助解决这个问题。

答案 4 :(得分:0)

如果您使用的是10g或更高版本,则可以使用带有内嵌视图的正则表达式。

内部选择是仅获取数字校验数字。然后转换和使用where子句很容易。像

这样的东西

选择*来自( 选择 * 来自payment_line 其中regexp_like(check_num,'^ [0-9] * $') ) 其中to_number(check_num)> 12345;

当然,只有当你想要所有数字校验码大于12345时,这才有效。如果你想要包括像1A123这样的“数字”,那就是另一个故事了。