2009-07-18 33 views
6

tôi cần một truy vấn giúp đỡ nso sánh Numeric trên dữ liệu cột chuỗi

"totalexp" là một lĩnh vực nvarchar ... trong một bảng và tôi cần phải chọn như dưới đây

select EmpId,FirstName,totalexp from sample where totalexp > '6' 

empid firstname  totalexp 
1  Me    8.2 
5  as    6 
10  567    64 mon 
11  leader   6+ yrs 
12  admintest  6.3 
16  G    6 

tôi có giá trị như 11, 12, 21 và tất cả của nó không hiển thị những điều

+0

Chuyển đổi cột int đầu tiên. Nó phù hợp hơn theo cách đó. –

+0

Nó sẽ làm tổn thương để bao gồm một mô tả trong câu hỏi !!! –

+0

Tôi giả sử bạn có "mon", "yrs", "+" v.v ... trong cột totalexp? Khi lọc, bạn có muốn "6.3" và "64 mon" trong đầu ra hay chỉ dữ liệu số nguyên/số thực? – gbn

Trả lời

2

lẽ 'totalexp' cần phải được một trường số (int vv) chứ không phải là nvarchar cho sự so sánh trong mệnh đề where để làm việc. Sử dụng nvarchar để lưu trữ số không phải là một ý tưởng tốt.

+0

Có bạn là đúng, nhưng đây là bảng cũ được sử dụng trong kinh doanh, nhưng bây giờ tôi phải lọc dựa trên điều kiện đó. là có bất kỳ cách nào –

7

Nếu bạn không thể thay đổi loại cột của bạn, bạn phải sử dụng CAST or CONVERT trước khi bạn làm việc so sánh. Mã của bạn sẽ là:

SELECT EmpId, FirstName, TotalExp 
FROM sample 
WHERE CAST(TotalExp AS INT) > 6 

Một chút cảnh báo: với cấu trúc DB hiện tại của bạn, bất cứ ai có thể chèn TotalExp là 'Một' hoặc 'Hai' hoặc bất kỳ chuỗi tùy ý khác, và truy vấn của bạn sẽ thất bại. Không thực sự là điều bạn muốn xảy ra, nghiêm túc.

3

Đề xuất chính của tôi là bạn sẽ thực hiện một bài tập làm sạch dữ liệu để chuẩn hóa dữ liệu cột. Hiện nay có rất nhiều hình thức/tiêu chuẩn của dữ liệu trong một cột duy nhất.


Nếu bạn muốn bỏ qua dữ liệu nhân vật hoàn toàn tuy nhiên, sau đó để giải thích cho các giá trị cột rằng sẽ không chuyển đổi một cách tự nhiên để một số nguyên bạn có thể tận dụng các() chức năng IsNumeric để kiểm tra dữ liệu cột như là số.

Xem ví dụ sau đây để biết chi tiết:

create table #testTable 
(
    NumericAsString nvarchar(100) 
); 

insert into #testTable (NumericAsString) values('1'); 
insert into #testTable (NumericAsString) values('4'); 
insert into #testTable (NumericAsString) values('28'); 
insert into #testTable (NumericAsString) values('32'); 
insert into #testTable (NumericAsString) values('11232'); 
insert into #testTable (NumericAsString) values('fdsfdfas'); 
insert into #testTable (NumericAsString) values('wtwtrwtw'); 

select * 
from #testTable; 

select NumericAsString 
from #testTable 
where 
    (
    case 
     when isnumeric(NumericAsString) = 1 then convert(int, NumericAsString) 
     else 0 
    end) 
    > 6 

drop table #testTable; 
+0

... Sẽ thất bại cho dữ liệu phi số – gbn

+0

@gbn: Tuyệt đối nhưng tôi cho một người có thể nghĩ rằng nó đi mà không nói. Tuy nhiên, để cải thiện độ rõ ràng, tôi đã sửa đổi bài gốc để kiểm tra dữ liệu số –

+0

Tôi không bao giờ giả định rằng dân gian sẽ chọn cái này ... Tôi nghĩ yêu cầu vẫn mơ hồ. OP thực sự muốn lọc gì? – gbn

2

Hãy thử sử dụng Cast or Convert trên bạn mệnh đề where để thay đổi kiểu của totalexp đến một số nguyên.

SELECT EmpId,FirstName,totalexp 
FROM sample 
WHERE CONVERT(int ,totalexp) > 6 
+1

... Sẽ thất bại đối với dữ liệu không phải số – gbn

5

Các mớ hỗn độn bắt đầu với TotalExp là nvarchar, vì nó chứa dữ liệu mà có thể là "6 tháng", "6 năm", "6 + yrs" vv ý định đằng sau

where totalexp > '6' 
là gì

? 6 năm, 6 tháng, 65 ngày?

Bạn cần chuyển đổi dữ liệu sang định dạng số, ví dụ: số tháng bạn có thể so sánh với một số yêu cầu (như 'tháng kinh nghiệm').

Tuy nhiên, trong một năm dữ liệu của bạn sẽ trở nên lỗi thời vì nó không thay đổi, vì bạn sẽ ngoại trừ mọi TotalExp hiện tại là "6 tuổi" (nếu kỹ năng đó đã được thực hiện trong thời gian chờ đợi).

Vì vậy, đối với các kỹ năng hoạt động, sẽ có lợi hơn khi có trường ExperienceSince DATETIME, có hiệu ứng tốt đẹp khiến "trải nghiệm tổng thể" kết quả luôn được cập nhật.

2

Tôi biết câu hỏi là rất cũ. Chỉ cần đăng câu trả lời vì nó có thể hữu ích cho một số một.

Mã bên dưới có thể được sử dụng trong các trường hợp có giá trị không phải số cho các hàng khác.

SELECT EmpId,FirstName,totalexp 
FROM sample 
WHERE 
(CASE 
WHEN (ISNUMERIC(totalexp) = 1) 
THEN CAST(LTRIM(RTRIM(totalexp)) AS float) 
ELSE 0 END) > 6 

Mã này được thử nghiệm làm việc

+0

Cảm ơn bạn đã chỉnh sửa câu trả lời jHilscher – Shammas

+1

Tôi có thể sai nhưng tôi cảm thấy "ELSE 0" (dòng cuối cùng) có thể gây ra kết quả sai khi so sánh với 0. Có lẽ bạn nên sử dụng "ELSE NULL" để thay thế. –