我在payment_line表(Oracle)中有一个名为check_num(银行支票号)的列为VARCHAR2类型。
要求是“我必须搜索所有那些数字大于12345的支票。
请建议我如何实现这一目标?
答案 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
您能否确认02134
和11111
都应该在此结果集中?它们似乎不符合>
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这样的“数字”,那就是另一个故事了。