2017-09-18 1 views
1

숫자와 문자가 결합 된 값을 가진 기존 데이터베이스의 열이 거의 없습니다. 이것은 내가 새 테이블에서 청소하고 가져와야 할 부분입니다. 필요한 값의 대부분은 다음과 같이 변환 할 : 등등 40A 또는 3R 및 :값의 문자를 잘라내거나 바꾸는 방법은 무엇입니까?

40M or 85M or NR or 5NR ... 

같은 값이 될 수 있습니다 여전히 기존 시스템에 입력 할 수있는 사용자 유효성 검증이 없었기 때문에. 내 새 테이블에 숫자 값만 가져 오려고합니다. 그래서 가치에 글자가 있다면 나는 그것들을 다듬고 싶습니다. SQL Server에서이를 수행하는 가장 좋은 방법은 무엇입니까? 나는 이것을 시도했다 :

CASE WHEN CHARINDEX('M',hs_ptr1) <> 0 THEN 1 ELSE 0 END AS hs_ptr1 

그러나 이것은 단 하나의 글자가 가치에 있는지를 확인한다. 아무도 도와 줄 수 없다면 알려주세요. 감사!

+1

Google 검색 문자열은 SQL 서버 patindex''입니다 .... 기능이없는 방법입니다. –

+0

[숫자가 아닌 문자를 제거하기위한 T-SQL select 쿼리]의 가능한 복제본 (https://stackoverflow.com/questions/18625548/t-sql-select-query-to-remove-non-numeric-characters) –

답변

1

patindex을 사용하면 패턴을 검색 할 수 있습니다. 이 코드를보십시오 :

코드 : 당신은 PATINDEX function에 가서 숫자가 아닌 문자를 검색

CREATE TABLE #temp 
(
     TXT NVARCHAR(50) 
) 

INSERT INTO #temp (TXT) 
VALUES 
    ('40M'), 
    ('85M'), 
    ('NR'), 
    ('5NR') 

SELECT LEFT(subsrt, PATINDEX('%[^0-9]%', subsrt + 't') - 1) 
FROM (
    SELECT subsrt = SUBSTRING(TXT, pos, LEN(TXT)) 
    FROM (
     SELECT TXT, pos = PATINDEX('%[0-9]%', TXT) 
     FROM #temp 
    ) d 
) t 

DROP TABLE #temp 
0

. 그런 색인이 존재하면, 그 왼쪽에있는 모든 것을 붙잡아 라. 뭐 그런 :

SELECT LEFT(your_field_name, PATINDEX("%[^0-9]%", your_field_name) - 1) 
FROM your_table_name 

UPDATE

글쎄, 당신은 어떤 가장자리 케이스를 돌봐해야합니다. 예 : 숫자가 아닌 데이터가 없으면 함수는 0을 반환하므로 계산할 때 -1이됩니다. 실제로 유효하지 않은 길이입니다.

Common Table Expression을 사용하여 숫자가 아닌 데이터의 인덱스를 계산 한 다음 IIF expression을 구성하여 올바른 문자 데이터를 선택하는 것이 좋습니다. 예 :

WITH cte AS 
(
    SELECT *, PATINDEX("%[^0-9]%", your_field_name) AS NumLength 
    FROM your_table_name 
) 
SELECT any_other_field, IIF(NumLength = 0, 
    your_field_name, 
    LEFT(your_field_name, PATINDEX("%[^0-9]%", your_field_name) - 1) 
) 
FROM cte 
+0

I 오류 메시지가 나타납니다 : 유효하지 않은 길이 매개 변수가 SUBSTRING 함수에 전달되었습니다. –

1

여기

declare @table table (c varchar(256)) 
insert into @table 
values 
('40M'), 
('30'), 
('5NR'), 
('3(-4_') 

select 
replace(LEFT(SUBSTRING(replace(replace(replace(replace(replace(c,'(',''),')',''),'-',''),' ',''),',',''), PATINDEX('%[0-9.-]%', replace(replace(replace(replace(replace(c,'(',''),')',''),'-',''),' ',''),',','')), 8000), 
      PATINDEX('%[^0-9.-]%', SUBSTRING(replace(replace(replace(replace(replace(c,'(',''),')',''),'-',''),' ',''),',',''), PATINDEX('%[0-9.-]%', replace(replace(replace(replace(replace(c,'(',''),')',''),'-',''),' ',''),',','')), 8000) + 'X') -1),'.','') 
from @table 
관련 문제