2012-07-04 44 views
9

Giả sử tôi có một vài lĩnh vực như sau:SQL chỉ mất các giá trị số từ một varchar

abd738927 
jaksm234234 
hfk342 
ndma0834 
jon99322 

Loại: varchar.

Làm thế nào để chỉ mất các giá trị số từ này để hiển thị:

738927 
234234 
342 
0834 
99322 

đã thử chuỗi tuy nhiên các dữ liệu thay đổi theo chiều dài, và đúc didnt làm việc hoặc là do không có khả năng chuyển đổi, bất kỳ ý tưởng?

+0

Hãy xem 'PATINDEX'. –

+0

Yep, patindex, giả sử tất cả các số được nhóm lại với nhau, như trong ví dụ của bạn, nếu không bạn có thể cần một hàm. – Sean

+0

Bạn có phải làm điều này trong SQL hoặc là thao tác sau truy vấn được phép không? Nếu vậy thì tôi sẽ sử dụng một regex để trích xuất số để hiển thị; Tôi đã làm một tìm kiếm cursory và đã không đi qua bất cứ điều gì cho thấy rằng bạn có thể sử dụng một biểu thức chính quy giữa SELECT và FROM. – Thevenin

Trả lời

10

Dưới đây là ví dụ với PATINDEX:

select SUBSTRING(fieldName, PATINDEX('%[0-9]%', fieldName), LEN(fieldName)) 

này giả (1) trường sẽ có một số, (2) numerics đều nhóm lại với nhau, và (3) các số không có bất kỳ ký tự tiếp theo sau họ.

+1

Và, nếu trường không có số thì sao? – user990016

+0

@ user990016 sau đó thêm mệnh đề 'where' để lọc những bản ghi đó hoặc câu lệnh' case' để trả về giá trị mặc định cho những bản ghi đó. Vì vậy: 'WHERE fieldName LIKE '% [0-9]%'' và 'CASE WHEN fieldName NOT LIKE '% [0-9]%' THEN 'DEFAULT_VALUE' ELSE SUBSTRING (tên trường, PATINDEX ('% [0-9] % ', fieldName), LEN (fieldName)) END' – Sean

2

Tôi nghĩ bạn đang muốn có chức năng Val() của VBA. Dễ dàng, đủ để thực hiện với IsNumeric()

create function Val 
(
    @text nvarchar(40) 
) 
returns float 
as begin 
    -- emulate vba's val() function 
    declare @result float 
    declare @tmp varchar(40) 

    set @tmp = @text 
    while isnumeric(@tmp) = 0 and len(@tmp)>0 begin 
     set @tmp=left(@tmp,len(@tmp)-1) 
    end 
    set @result = cast(@tmp as float) 

    return @result 
end 
2
DECLARE @NonNumeric varchar(1000) = 'RGI000Testing1000' 
DECLARE @Index int 
SET @Index = 0 
while 1=1 
begin 
    set @Index = patindex('%[^0-9]%',@NonNumeric) 
    if @Index <> 0 
    begin 
     SET @NonNumeric = replace(@NonNumeric,substring(@NonNumeric,@Index, 1), '') 
    end 
    else  
     break; 
end  
select @NonNumeric -- 0001000 
2

Extract chỉ số (không sử dụng vòng lặp while) và kiểm tra mỗi nhân vật để xem nếu nó là một con số và giải nén nó

Declare @s varchar(100),@result varchar(100) 
    set @s='as4khd0939sdf78' 
    set @result='' 

    select 
     @[email protected]+ 
       case when number like '[0-9]' then number else '' end from 
     (
      select substring(@s,number,1) as number from 
      (
       select number from master..spt_values 
       where type='p' and number between 1 and len(@s) 
      ) as t 
     ) as t 
    select @result as only_numbers 
1
select substring(
       'jaksm234234', 
       patindex('%[0-9]%','jaksm234234'), 
       LEN('jaksm234234')-patindex('%[0-9]%','jaksm234234')+2 
       ) 
+0

Tôi đang xem ví dụ của bạn và nó cho phép chuyển đổi thành lỗi int nếu cột không chứa bất kỳ số nào. Có suy nghĩ gì không? – user990016

3

Vâng, nếu bạn không muốn tạo một hàm, bạn có thể chỉ một cái gì đó như thế này:

cast(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(
replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(
replace(replace(replace(replace(replace(replace(replace(replace(replace(YOUR_COLUMN 
,'A',''),'B',''),'C',''),'D',''),'E',''),'F',''),'G',''),'H',''),'I',''),'J','') 
,'K',''),'L',''),'M',''),'N',''),'O',''),'P',''),'Q',''),'R',''),'S',''),'T','') 
,'U',''),'V',''),'W',''),'X',''),'Y',''),'Z',''),'$',''),',',''),' ','') as float) 
+11

OMG, xin vui lòng không làm điều này ... – Nelson

+6

Giải pháp này sẽ ám ảnh những giấc mơ của tôi mãi mãi. –

+0

đáng lo ngại – dllhell

2

input table

nếu bạn có dữ liệu như trên trong hình ảnh, sau đó sử dụng các truy vấn dưới đây

select field_3 from table where PATINDEX('%[ ~`[email protected]#$%^&*_()=+\|{};",<>/?a-z]%', field_3)=0 

Kết quả sẽ được giống như thế này

Result table

Các vấn đề liên quan