이 질문은 주어진 데이터 세트에 대해 잘못되었거나 현재 작동하는 방식으로 작성하기가 쉽지만 다른 데이터 세트에서는 작동하지 않으므로보기보다 까다 롭습니다.
데이터베이스에 저장하는 데이터 인 경우 데이터베이스 정규화에 대해 자세히 알아 보시기 바랍니다. 정규화의 한 가지 교리는 하나의 값만 열에 저장한다는 것입니다. 이 경우 datetime과 정수 값을 같은 열에 저장합니다. 여러 열에 데이터를 저장하는 것이 훨씬 더 좋습니다.
즉, 데이터베이스에 가져올 원시 데이터가있는 경우가 있다는 것을 알고 있습니다. 종종 우리는 주어진 원시 데이터를 제어 할 수 없으므로 SQL 체조로 처리해야합니다. 이 특별한 경우에는 여러 가지 유형의 백 플립이 유용 할 것입니다.
- 문자열에서 ~ 문자 수를 결정하십시오.
- 물결표에 데이터를 나눕니다.
- 값 중 하나가 날짜 시간인지 확인
- 다른 값이 정수인지 확인하십시오.
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
오케이 ... [무엇을 시도 했습니까?] (http://www.whathaveyoutried.com)? – Kermit
어떤 버전의 SQL Server입니까? 빠른 Google for T-SQl String 함수와 T-SQl Date 함수를 사용하면이 작업을 완료 할 수 있습니다. –