Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 支票号码问题_Sql_Oracle - Fatal编程技术网

Sql 支票号码问题

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; 干杯

我在付款行表(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 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