2013-02-23 4 views
-1

나는 가끔 같은 문자열을 포함하는 필드가 다음 2/23/2013 12:25:55~45분할 및 분석 데이터

내가 왼쪽 무슨 ~ 유효한 날짜 시간 값 인 경우 ~ 상기 문자열을 분할하고 파악해야 ~의 오른쪽은 유효한 정수입니다. 기본적으로 내가 돌려주고 싶은 것은 그 조건이 맞는지 참/거짓이라는 것입니다.

필드에는 null이 포함될 수 있고 다른 유형의 데이터가 포함될 수 있으며 여러 개의 물결표가 포함될 수 있습니다. 모든 경우에 나는 false를 돌려 줄 필요가있다. 사실로 돌아갈 필요가있는 유일한 시간은 필드에 날짜/시간 값, 단일 물결표 및 정수가 포함되어있는 경우입니다.

+0

오케이 ... [무엇을 시도 했습니까?] (http://www.whathaveyoutried.com)? – Kermit

+0

어떤 버전의 SQL Server입니까? 빠른 Google for T-SQl String 함수와 T-SQl Date 함수를 사용하면이 작업을 완료 할 수 있습니다. –

답변

2

SQL 서버, 당신은 할 수 :

select (case when col like '%~%' 
      then (case when isdate(left(col, charindex('~', col) - 1)) = 1 and 
          isnumeric(substring(col, charindex('~', col)+1, 1000)) = 1 and col not like '%~%.%' and col not like '%~%e%' 
         then 1 
         else 0 
        end) 
      else 0 
     end) as IsFunkyFormat, substring(col, charindex('~', col)+1, 1000), left(col, charindex('~', col) - 1) 

중첩 된 케이스는 분리가 발견되지 않는 경우 오류를 방지하는 것입니다. not like 표현식은 정수가 아닌 숫자 형식을 배제합니다.

+0

나는이 문제에 대한 해답을 너무 잡고있다. 방금 솔루션을 테스트하고 입력 문자열이 단일 공백 ​​또는 빈 문자열 인 경우 오류가 있음을 확인합니다. –

+0

@GMastros. . . 이 값들을 테스트 할 때 정확하게 "0"을 반환합니다. ''~ ''에 대해서도 0을 돌려 주므로, 당신이 무엇을 언급하는지 모른다. –

+0

사과드립니다. 이게 바로 "왼쪽 (Data, charindex ('~', Data) - 1)"으로 실제 오류는 아니지만 단순히 테스트 코드 일뿐입니다. –

0

이 질문은 주어진 데이터 세트에 대해 잘못되었거나 현재 작동하는 방식으로 작성하기가 쉽지만 다른 데이터 세트에서는 작동하지 않으므로보기보다 까다 롭습니다.

데이터베이스에 저장하는 데이터 인 경우 데이터베이스 정규화에 대해 자세히 알아 보시기 바랍니다. 정규화의 한 가지 교리는 하나의 값만 열에 저장한다는 것입니다. 이 경우 datetime과 정수 값을 같은 열에 저장합니다. 여러 열에 데이터를 저장하는 것이 훨씬 더 좋습니다.

즉, 데이터베이스에 가져올 원시 데이터가있는 경우가 있다는 것을 알고 있습니다. 종종 우리는 주어진 원시 데이터를 제어 할 수 없으므로 SQL 체조로 처리해야합니다. 이 특별한 경우에는 여러 가지 유형의 백 플립이 유용 할 것입니다.

  1. 문자열에서 ~ 문자 수를 결정하십시오.
  2. 물결표에 데이터를 나눕니다.
  3. 값 중 하나가 날짜 시간인지 확인
  4. 다른 값이 정수인지 확인하십시오.

SQL Server에는 4 개 항목 중 하나만 내장되어 있습니다. 문자열 매개 변수를 사용하고 문자열로 표시된 날짜를 날짜로 변환 할 수 있는지 여부를 나타내는 비트를 반환하는 함수 이름 IsDate가 있습니다.

문자열에서 ~의 수를 결정하기 위해 물음표가있는 문자열의 길이와 물결표가없는 문자열의 길이를 결정하는 것이 트릭입니다. 우리는 행이 작업을 수행하여 하나의 물결을 포함하는 확인할 수 있습니다 해결하기

When Len(Data) = Len(Replace(Data, '~', '')) + 1 

다른 까다로운 문제가 문자열 정수를 나타내는 경우 결정하는 것입니다. 이렇게하는 방법은 여러 가지가 있지만 가장 좋아하는 방법은 하드 코딩 된 값을 데이터에 연결 한 다음 숫자를 테스트하는 것입니다. 예를 들어, e가 과학 표기법을 나타내고 1e4가 1000으로 해석 될 수 있기 때문에 IsNumeric 함수는 문자열 1e4에 대해 true를 반환합니다.당신이 그렇게한다면 :

IsNumeric(Data + 'e0') 

이 과학적 표기법에 대해 false를 반환 할 데이터는 숫자 아닌 '1e4e0'를 얻기 위해 'E0'에 연결됩니다 1E4, 같은 것 때문이다. 마찬가지로 .0을 문자열에 연결하여 소수점을 확인합니다. 데이터가 45.2 (숫자)이고 .0을 연결하면 숫자가 아닌 '45 .2.0 '이됩니다. 테스트에 '-'를 추가하여 양수가 있는지 확인할 수도 있습니다. '-20'은 숫자이지만 '-'+ '-20'('--20')은 숫자가 아닙니다.

Select YourColumnHere, 
     Len(Replace(YourColumnHere, '~', '')) + 1, 
     Case When Len(YourColumnHere) = Len(Replace(YourColumnHere, '~', '')) + 1 
      Then 
        Case When IsDate(Left(YourColumnHere, CharIndex('~', YourColumnHere)-1)) = 1 
         Then 
           Case When Right(YourColumnHere, Len(YourColumnHere)-CharIndex('~', YourColumnHere)) > '' 
            Then IsNumeric('-' + Right(YourColumnHere, Len(YourColumnHere)-CharIndex('~', YourColumnHere)) + '.0e0') 
            Else 0 
            End 
         Else 0 
         End 
      Else 0 
      End 
From YourTableNameHere