문제

내 데이터베이스(SQL 2005)에는 주석이 포함된 필드가 있지만 주석에는 ID가 있으므로 ID만 제거하고 가능하다면 이를 int로 변환하고 싶습니다.

activation successful of id 1010101

위의 줄은 db 필드에 있는 데이터의 정확한 구조입니다.

그리고 아니요, 저는 애플리케이션 코드에서 이 작업을 수행하고 싶지 않습니다. 실제로는 건드리고 싶지도 않습니다. 궁금하실 경우를 대비해 ;-)

도움이 되었습니까?

해결책

이렇게 하면 트릭을 수행할 수 있습니다.

SELECT SUBSTRING(column, PATINDEX('%[0-9]%', column), 999)
FROM table

샘플 데이터에 따르면 문자열에 정수가 한 번만 발생하고 끝에 있다는 것입니다.

다른 팁

현재로서는 테스트할 수 있는 수단이 없지만 다음과 같습니다.

select convert(int, substring(fieldName, len('activation successful of id '), len(fieldName) - len('activation successful of id '))) from tableName

약간의 코드를 작성해 보시겠습니까?한 가지 옵션은 CLR 사용자 정의 함수를 만든 다음 Regex를 사용하는 것입니다.자세한 내용을 확인하실 수 있습니다 여기.이것은 복잡한 문자열을 처리합니다.

위 줄이 항상 'id #######의 활성화 성공' 형식이고 필드 끝에 숫자가 있는 경우 다음을 수행하세요.

declare @myColumn varchar(100)
set @myColumn = 'activation successful of id 1010102'


SELECT
    @myColumn as [OriginalColumn]
,   CONVERT(int, REVERSE(LEFT(REVERSE(@myColumn), CHARINDEX(' ', REVERSE(@myColumn))))) as [DesiredColumn]

다음을 제공합니다:

OriginalColumn                           DesiredColumn
---------------------------------------- -------------
activation successful of id 1010102      1010102

(1 row(s) affected)
select cast(right(column_name,charindex(' ',reverse(column_name))) as int)
CAST(REVERSE(LEFT(REVERSE(@Test),CHARINDEX(' ',REVERSE(@Test))-1)) AS INTEGER)
-- Test table, you will probably use some query  
DECLARE @testTable TABLE(comment VARCHAR(255))  
INSERT INTO @testTable(comment)  
    VALUES ('activation successful of id 1010101')

-- Use Charindex to find "id " then isolate the numeric part  
-- Finally check to make sure the number is numeric before converting  
SELECT CASE WHEN ISNUMERIC(JUSTNUMBER)=1 THEN CAST(JUSTNUMBER AS INTEGER) ELSE -1 END  
FROM (  
       select right(comment, len(comment) - charindex('id ', comment)-2) as justnumber  
       from @testtable) TT

또한 이 접근 방식은 세트 기반이므로 많은 데이터 값에 대해 더 효율적이라고 덧붙이고 싶습니다.하지만 하나의 값을 변수로 사용하는 것은 매우 쉽습니다.열 주석을 사용하는 대신 다음과 같은 변수를 사용할 수 있습니다. @chvComment.

주석 문자열이 정확히 그와 같으면 바꾸기를 사용할 수 있습니다.

select   replace(comment_col, 'activation successful of id ', '') as id from ....

하지만 그렇지 않을 것이 거의 확실합니다. 실패한 활성화는 어떻습니까?중첩된 교체 문으로 끝날 수 있습니다.

select   replace(replace(comment_col, 'activation not successful of id ', ''), 'activation successful of id ', '') as id from ....

[죄송하지만 이 편집 화면에서는 완전히 유효한 SQL인지 알 수 없습니다.]

그것은 지저분해지기 시작합니다.함수를 생성하고 그 안에 교체 문을 넣는 것을 고려할 수 있습니다.

일회성 작업이라면 별 문제가 되지 않습니다.정규식을 사용할 수도 있지만 속도가 매우 느립니다(어쨌든 이제 두 가지 문제가 있음을 의미합니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top