2016-07-22 1 views
0

원래 검색어 :SQL 쿼리에서 계산 된 행을 SUBSTR하는 방법?

SELECT F4105.COUNCS/10000 FROM F4105 

출력 :

나는 적어도 지난 5 제로를 제거해야
Numeric Expression 
    -------------------- 
    111.1643000000000000 
    111.1633000000000000 
    111.1633000000000000 
    101.7654000000000000 
    101.7654000000000000 
    112.7258000000000000 

. 하위 문자열을 만들려고했지만 작동하지 않았습니다. 잘못된 출력에 의해 일

Token F4105 was not valid. Valid tokens: (.

제 2 질의 :

(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               

제 1 회 쿼리가 저와 오류를 준 : 여기

쿼리 (들) 내가 시도이다.

SUBSTR  
00   
000000  
000000  
000000  
000000  
000000 
+0

이 질문은 ibm-midrange 태그에 표시된대로 IBM i의 DB2에 대한 것입니다. – WarrenT

답변

4

식에 열 별칭 정의를 혼합합니다. 올바른 표현은 다음과 같습니다.

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

그러나이 작업은 권장하지 않습니다. 당신은 숫자 표현을 가지고 있습니다. 그냥 당신이 원하는 진수 표현으로 변환 말 :

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

감사합니다. 두 번째 것이 효과적이었습니다. 그러나 첫 번째 것은 0 만 출력합니다. – Shank

+0

"첫 번째가 0으로만 출력됩니다.": 방금 제공 한 _answer_를 참조하십시오. 위의 첫 번째 이유는 'coFROM'을 'FR FROM'으로 다시 작성한 이유는 원하는 결과를 얻기 위해 SUBSTR의 사용을 LEFT의 사용으로 대체하거나, SUBSTR의 두 번째 인수로 리터럴 '1'을 삽입합니다. [length (...)가 세 번째 인수가됩니다]. – CRPence

1

SUBSTR 스칼라의 구문은 효과적으로 SUBSTR(expression, start-pos, for-length)IBM i 7.1->Database->Reference->SQL reference->Built-in functions->Scalar functions->SUBSTR

두 번째 인수에 대해 지정된() 표현식은 OP에서 사용 표시된 길이 ; 즉 start-pos 인수. 시작 위치로, 그 string-length minus five 계산의 결과가 가장 왼쪽 데이터를 얻기 위해 눈에 띄게 입니다. 즉, 시작 위치는 문자열의 길이보다 5 바이트 작습니다. 물론, 소수점 이하 자릿수의 문자열 표현의 끝에서 5 바이트의 중요하지 않은 0을 찾을 수 있습니다.

효과적인 보정 따라서
하기 •와 SUBSTR 스칼라 교체 •
중 하나 일 개시 POS 인수 [따라서 길이() 식 번째 인수가 제작]에서 1의 일정한 정수 값을 삽입하는 것 LEFT 스칼라.
이 두 수정본 중 적어도 하나는 원하는 결과물을 암시하는 것과 유사합니다. 그러나 DDL이없고 OP에서 표현되는 명시 적 출력이 무엇인지에 관계없이 이러한 수정 된 표현식의 실제 효과는 추측 할 수밖에 없습니다.
어쨌든, 그러한 변경 중 하나라도, 제안 된 대체 문자 스트링 표현식은 명시 적 형변환의 부족에 따라 OP에서 하나의 표현식과 유사하게 불량한 것으로 나타납니다. 즉, [바람직한 결과를 얻을 수 마찬가지로 가능성이 남아 아직] 아마도 시정로 제시 한 두 개정 된 표현은 다음과 같습니다

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

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

갖는 설립 데이터 형 \ 길이를 사용하여 속성을 명시 적으로 캐스팅 [즉, 리터럴 숫자 값 목록에서 OP에 표시된 출력을 생성하는 입력 값을 생성하는 파생 테이블 식에서 다음 쿼리의 문자 스트링 표현식을 사용하면 소수점 오른쪽의 10 진수 정밀도 만 11 자리수 [ie스케일]가 유지됩니다. 따라서 시각적으로 후미 다섯 자리는 잘립니다.

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