如何 SUBSTR SQL 查询中的计算行?

How to SUBSTR a calculated row in SQL Query?

原始查询:

SELECT F4105.COUNCS/10000 FROM F4105

输出:

 Numeric Expression 
  --------------------
  111.1643000000000000 
  111.1633000000000000 
  111.1633000000000000 
  101.7654000000000000 
  101.7654000000000000 
  112.7258000000000000

我需要至少删除最后 5 个零。我尝试做一个子字符串,但没有成功。

这是我尝试过的查询:

(1) 
   SELECT SUBSTR((F4105.COUNCS/10000 AS 'co'),length((co)-5) FROM F4105  
(2)
   SELECT SUBSTR((F4105.COUNCS/10000),length((F4105.COUNCS/10000)-5)) FROM F4105                                                        

第一个查询给了我错误:

Token F4105 was not valid. Valid tokens: (.

第二个查询因错误输出而工作。

 SUBSTR     
 00         
 000000     
 000000     
 000000     
 000000     
 000000

您在表达式中混用了列别名定义。所以,正确的表达方式更像是:

SELECT SUBSTR(F4105.COUNCS/10000, length(F4105.COUNCS/10000.0) - 5) as coFROM F4105

不过,我不建议这样做。你有一个数字表达式。只需将其转换为您想要的十进制表示形式即可,比如:

SELECT CAST(F4105.COUNCS/10000.0 as DECIMAL(10, 5))

SUBSTR 标量的语法实际上是 SUBSTR(expression, start-pos, for-length) IBM i 7.1->Database->Reference->SQL reference->Built-in functions->Scalar functions->SUBSTR

OP 中显示的 LENGTH() 表达式指定为第二个参数;即 start-pos 参数。作为起始位置,string-length minus five计算的结果明显不正确获取最左边的数据;即起始位置比字符串的长度少五个字节。当然,这会从除法的十进制结果的字符串表示形式的末尾找到一些无关紧要的零。

因此,作为有效的更正,可以是
• 为start-pos 参数插入常量整数值1 [从而使LENGTH() 表达式成为第三个参数]
• 将 SUBSTR 标量替换为 LEFT 标量。
这些修订中的任何一个都将实现至少类似于所暗示的所需输出的结果。然而,如果没有 DDL 和 OP 中应该表达的显式输出,只能猜测这些修改后的表达式的实际效果。
无论如何,即使有这些更改中的任何一个,那些建议的替代字符 -由于缺乏显式转换,字符串表达式与 OP 中的表达式选择一样糟糕[接近愚蠢];即建议作为可能纠正的两个修改后的表达式[但同样不太可能产生理想的结果]是:

  SUBSTR((F4105.COUNCS/10000), 1,length((F4105.COUNCS/10000)-5))     

  LEFT((F4105.COUNCS/10000),length((F4105.COUNCS/10000)-5))

已使用显式转换建立 data-type\length 属性 [即即使没有一些实际的 DDL 也建立]在派生的 table 表达式中生成输入值,这些输入值将产生 OP 中显示的输出,来自文字数值列表,字符串表达式以下查询确保小数点右边只有十一位十进制精度[即scale] 保持不变;因此在视觉上,效果是尾随的五位数字被截断:

  with F4105 (COUNCS) as ( values   
     ( dec(  1111643.   , 9, 2 ) )  
    ,( dec(  1111633.   , 9, 2 ) )  
    ,( dec(  1111633.   , 9, 2 ) )  
    ,( dec(  1017654.   , 9, 2 ) )  
    ,( dec(  1017654.   , 9, 2 ) )  
    ,( dec(  1127258.   , 9, 2 ) )  
                         )          
  SELECT cast(  dec( (F4105.COUNCS/10000), 17, 11 ) as varchar(19) )
  FROM F4105