Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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
在IBM SQL中选择范围内的地址记录_Sql_Parsing_Casting_Iseries Navigator - Fatal编程技术网

在IBM SQL中选择范围内的地址记录

在IBM SQL中选择范围内的地址记录,sql,parsing,casting,iseries-navigator,Sql,Parsing,Casting,Iseries Navigator,我正在通过IBM的iNavigator使用SQL。我有以下疑问: SELECT PWGEOADDR AS ADDRESS, POSSTR(PWGEOADDR, ' ')-1 AS FIRSTWORDCHARS, SUBSTR(PWGEOADDR, 1, POSSTR(PWGEOADDR, ' ')-1) AS HOUSECHAR, INTEGER(SUBSTR(PWGEOADDR, 1, POSSTR(PWGEOADDR, ' ')-1)) AS HOUSENUMBER FROM DSDLIB.

我正在通过IBM的iNavigator使用SQL。我有以下疑问:

SELECT
PWGEOADDR AS ADDRESS,
POSSTR(PWGEOADDR, ' ')-1 AS FIRSTWORDCHARS,
SUBSTR(PWGEOADDR, 1, POSSTR(PWGEOADDR, ' ')-1) AS HOUSECHAR,
INTEGER(SUBSTR(PWGEOADDR, 1, POSSTR(PWGEOADDR, ' ')-1)) AS HOUSENUMBER
FROM DSDLIB.PWPPERMITS
在我的结果窗格中,我看到如下结果:

ADDRESS                 FIRSTWORDCHARS   HOUSECHAR             HOUSENUMBER
----------------------------------------------------------------------------
1730 West 800 South    4                 1730                           1730
273 E Heather Road     3                 273                             273
56 N State Street      2                 56                               56
2080 S. Main           4                 2080                           2080
Across Oakcrest Dr.    6                 Across               ++++++++++++++
123 North Main         3                 123                             123
+字符是我在SQL窗口中看到的文字字符。我照样复制并粘贴了它们

我的问题是:我无法查询在给定范围内(例如30到50之间)有门牌号的地址记录。我想忽略无法成功转换的行。每当我添加WHERE语句将强制转换的结果与任何内容进行比较时,我都会从AS/400中得到以下错误:

SQL状态:22023

供应商代码:-802

Message: [SQL0802] Data conversion or data mapping error. 
Cause . . . . . :   Error type 6 has occurred. 
错误类型及其含义如下:

1 -- Arithmetic overflow. 

2 -- Floating point overflow. 

3 -- Floating point underflow. 

4 -- Floating point conversion error. 

5 -- Not an exact result. 

6 -- Numeric data that is not valid. 

7 -- Double-byte character set (DBCS) or UTF-8 data that is not valid. 

8 -- Division by zero. 

9 -- Hash value cannot be computed for the requested query. 

10 -- User-defined function returned a mapping error. 

11 -- Not valid length found in a varying-length column returned from an array result set. 

12 -- Result of a concatenation operation on a varying-length field exceeded the maximum allowed length of the result type. If the error occurred when assigning a value to a host variable of a FETCH, embedded SELECT, SET, or VALUES INTO statement, the host variable name is *N and the relative position of the host variable in the INTO clause is 0. If the host variable name is *N, the error occurred when attempting to resolve a search condition. If more than one data mapping error occurred, this is a description of the first error that occurred.  For a description of any other data mapping errors, see the previously listed messages in the job log. Recovery  . . . :   The error was caused by data that was not valid or that was too large.  Look at the previously listed messages in the job log (DSPJOBLOG command) or press F10 (Display messages in job log) on this display to determine what row and columns were involved in the error.  Correct the data and then try the request again.

我已经尝试过将强制转换与NULL、SNAN、INFINITY和+++进行比较。

我认为下面的方法会起作用。通过使用translate删除单词中的数字并检查字符串的长度,测试第一个单词是否为数字。然后将结果转换为整数:

SELECT PWGEOADDR AS ADDRESS, POSSTR(PWGEOADDR, ' ')-1 AS FIRSTWORDCHARS,
       SUBSTR(PWGEOADDR, 1, POSSTR(PWGEOADDR, ' ')-1) AS HOUSECHAR,
       (case when LENGTH(RTRIM(TRANSLATE(SUBSTR(PWGEOADDR, 1, POSSTR(PWGEOADDR, ' ')-1), '*', '0123456789'))) = 0
             then INTEGER(SUBSTR(PWGEOADDR, 1, POSSTR(PWGEOADDR, ' ')-1))
        end) AS HOUSENUMBER
FROM DSDLIB.PWPPERMITS;
要在where子句中使用,您需要将其作为子查询:

select t.*
from (SELECT PWGEOADDR AS ADDRESS, POSSTR(PWGEOADDR, ' ')-1 AS FIRSTWORDCHARS,
             SUBSTR(PWGEOADDR, 1, POSSTR(PWGEOADDR, ' ')-1) AS HOUSECHAR,
             (case when LENGTH(RTRIM(TRANSLATE(SUBSTR(PWGEOADDR, 1, POSSTR(PWGEOADDR, ' ')-1), '*', '0123456789'))) = 0
                   then INTEGER(SUBSTR(PWGEOADDR, 1, POSSTR(PWGEOADDR, ' ')-1))
              end) AS HOUSENUMBER
      FROM DSDLIB.PWPPERMITS
     ) t
where housenumber between 10 and 15;

谢谢你给我指明了正确的方向。我的最终查询如下,其中我使用asterix字符执行翻译,但也使用asterix字符填充它。然后,我将asterix字符串与asterix的重复字符串进行比较。查询如下:选择*FROM SELECT PWPERMIT,PWGEOADDR as ADDRESS,CHARSUBSTRPWGEOADDR,1,POSSTRPWGEOADDR,'-1,10 as HOUSECHAR,CASE WHEN REPEAT,LENGTHSUBSTRPWGEOADDR,1,POSSTRPWGEOADDR,'-1=translatesSubstrpwgeoaddr,1,POSSTRPWGEOADDR,'-1,'0123456789','*'然后是INTEGERSUBSTRPWGEOADDR,1,POSSTRPWGEOADDR,“-1作为门牌号结束,ChartTranslatesSubstrPwGeoAddr,1,POSSTRPWGEOADDR,”-1,“*************”,“0123456789”,“-”,10作为DSDLIB的星星。如果门牌号<100