Sql 支票号码问题
我在付款行表(Oracle)中有一个名为check_num(银行支票号码)的列作为VARCHAR2类型 要求是“我必须搜索所有数字大于12345的支票Sql 支票号码问题,sql,oracle,Sql,Oracle,我在付款行表(Oracle)中有一个名为check_num(银行支票号码)的列作为VARCHAR2类型 要求是“我必须搜索所有数字大于12345的支票 请建议我如何做到这一点?我希望以下内容可以帮助您- select * from checkTable where TO_NUMBER(check_num) > 12345; 干杯我希望以下内容可以帮助您- select * from checkTable where TO_NUMBER(check_num) > 12345; 干杯
请建议我如何做到这一点?我希望以下内容可以帮助您-
select * from checkTable where TO_NUMBER(check_num) > 12345;
干杯我希望以下内容可以帮助您-
select * from checkTable where TO_NUMBER(check_num) > 12345;
干杯很可能有一个更优雅的解决方案,但这应该可以做到:
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
好的,我想我看到了你要做的。你正在寻找数据库中输入行之后输入的行。如果你查看上面的格式化列表,你会看到你的结果集在你的输入字符串下面。因此,考虑到这一点,我提交以下内容供你批准:
SELECT *
FROM payment_line
WHERE rowid > (select rowid from payment_line where check_num ='1A117');
很可能有一个更优雅的解决方案,但这应该可以做到:
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
好的,我想我看到了你要做的。你正在寻找数据库中输入行之后输入的行。如果你查看上面的格式化列表,你会看到你的结果集在你的输入字符串下面。因此,考虑到这一点,我提交以下内容供你批准:
SELECT *
FROM payment_line
WHERE rowid > (select rowid from payment_line where check_num ='1A117');
不幸的是,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
(即空字符串)。不幸的是,Oracle没有提供方便的函数,例如是整数(…)
,否则您可以执行如下查询:
-- 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
(即空字符串)。使用\u number()很棘手这是因为在应用to_number函数之前,强制Oracle应用一项检查,确保值可以安全地转换为数字并不容易,而且将来可能会出现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'),以帮助实现这一点。在这一要求中使用to_number()是很棘手的,因为在应用to_number函数之前,强制Oracle应用一个检查,以确保该值可以安全地转换为一个数字并不容易,而且将来可能会出现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')来帮助完成这项工作。如果您使用的是10g或更高版本,则可以将正则表达式与内联视图一起使用 内部选择是只获取数字校验号。然后转换和使用where子句很容易 从中选择*( 挑选* 从付款行 其中regexp_like(检查_num,“^[0-9]*$”) ) 去哪里的号码(检查号码)>12345
当然,只有当您希望所有数字校验号都大于12345时,这才有效。如果您还希望包含“数字”,如1A123,则情况就不同了。如果您使用的是10g或更高版本,则可以将正则表达式与内联视图一起使用 内部选择是只获取数字校验号。然后转换和使用where子句很容易 从中选择*( 挑选* 从付款行 其中regexp_like(检查_num,“^[0-9]*$”) ) 去哪里的号码(检查号码)>12345
当然,只有当你希望所有的数字校验数大于12345时,这才是有效的。如果你想要包括“1A123”在内的“数字”,那就不一样了。注意:如果你经常这样做,你可以考虑把数据存储在最适当的(序数)中。表单…即本例中的数字类型。这个表是由数据库团队设计和创建的,我不能将数据类型更改为数字。我已经与他们沟通了这个问题。如果我们更改该列的数据类型,可能会影响应用程序。因此,基本上我想要一个不改变表结构的解决方案。应该怎么做LD你会使用包含非数字字符的Cuff-JNUM VALS吗?是的,它也可以是非数字的。如果它是数字字段,我不会在论坛中问这个问题,这将是一个简单的查询来获得更大的数字。注意:如果你经常这样做,你可以考虑将数据存储在最适当的(序数)中。表单…即本例中的数字类型。那么ta