2014-05-01 3 views
1

메신저 SQL에 매우 익숙하며 약간의 조언이 필요합니다. 나는하겠습니다 그것을 간략한SQL 최대 길이 (합계) 복수 열

내가 3 주소 열을 해결 한 한 최대 길이 :

Add1 - Max 30 
Add2 - Max 20 
Add3 - Max 20 

내가 가장 긴 완전한 주소를 찾기 위해 질의를 필요로 (ADD1 + ADD2 + ADD3의 조합)

나는 다음하지만 난 그게 내가 그들을 내가 아는 개별 열, 모든 단지 최대 길이 값이었다주는 무슨 생각이 약 30

SELECT MAX(len(T.Address)) AS MaxOfAddress 
FROM (
    SELECT add_1 AS Address 
    FROM table 
    UNION ALL 
    SELECT add_2 AS Address 
    FROM table 
    UNION ALL 
    SELECT add_2 AS Address 
    FROM table) AS T 

답변

1

어떻게 사용하여 시도했다 쿼리 데이터에 대한

select 
    max(len(add_1)+len(add_2)+len(add_3)) Col 
from 
    table 

는 시도하십시오 :

select TOP 1 * 
From table 
order by len(add_1)+len(add_2)+len(add_3) desc 
+0

+1이 좋은,하지만 좀 더 필요 그가 실제 길이가 아닌 주소를 원하는대로 작업하십시오. – CodeBird

+1

@CodeBird 추가 된 답변을 확인하십시오. – TechDo

+0

그것은 그것을 분류했다. 모든 도움을 주셔서 대단히 감사합니다. 많은 좋은 해결책과 새로운 사용자로부터의 긴 대답에 대해 많이 aprpeciated – user3592268

1

아마 대부분의 DBMS와 함께 작동하는 버전이 될 것입니다 :

select add_1, add_2, add_3 
from T 
where length(trim(add_1)) + length(trim(add_2)) + length(trim(add_3)) 
    = (select max(len) 
     from (
     select 
     length(trim(add_1)) + length(trim(add_2)) + length(trim(add_3)) as len 
     from T 
     ) 
    ) 

를 사용할 수 add_n가 널 (NULL)이 될 수있는 경우 예 :

coalesce(trim(add_1),'') 

이 그것을 처리합니다.

DBMS가 CTE (Common Table Expressions)를 지원하는 경우이를 사용하는 것이 더 효율적일 수 있습니다. 뭔가 같은 :

with cte (add_1,add_2,add_3,len) as ( 
    select add_1,add_2,add_3 
     , length(trim(add_1))+length(trim(add_3))+length(trim(add_3)) from T 
) 
select add_1,add_2,add_3 
from cte 
where len = (select max(len) from cte) 

당신의 DBMS는 ROW_NUMBER 등의 분석 기능을 지원하는 경우 또 다른 옵션은 다음과 같습니다

select add_1,add_2,add_3 
from (
    select add_1,add_2,add_3 
     , row_number() over ( 
      order by length(trim(add_1))+length(trim(add_3))+length(trim(add_3)) desc 
      ) as rn 
    from t 
) where rn = 1 

또는 수

select add_1,add_2,add_3 
from T 
order by length(trim(add_1))+length(trim(add_3))+length(trim(add_3)) desc 
fetch first 1 rows only 
+0

+1! – CodeBird