2011-02-07 30 views
7

Tôi có một DB có trường số và tôi cần phải tìm kiếm tất cả các hàng và chỉ trả về các số không nguyên.SQL Tìm kiếm một trường số cho các số không hoàn toàn

Tôi đã cố gắng truy vấn dưới đây và nó giữ retuning hồ sơ mà có 0.

SELECT 
li.QTY 
FROM 
    TABLE LI 
WHERE 
    li.QTY like '%.%' 
+0

Xin lỗi, tôi đúc để varchar tôi rời khỏi exapmle – djshortbus

+0

Dưới đây là một câu hỏi liên quan ... Chỉ cần áp dụng những thông lệ với '<>' để cột của bạn: http://stackoverflow.com/questions/44046/truncate-not-round-decimal-places-in-sql-server – Matthew

Trả lời

12

Bạn có thể sử dụng LIKE chỉ với các lĩnh vực char, không phải với số lượng (số nguyên hoặc float) người.

Nếu bởi "số nguyên" bạn có nghĩa là 0.0, 2.0, -5,0, vv và không 12.5, 0,67 thì đây có thể làm:

SELECT li.QTY 
    FROM TABLE LI 
    WHERE li.QTY != ROUND(li.QTY , 0) 
; 

(cho SQL-Server: chỉnh sửa TRUNC vào ROUND) Bạn cũng có thể sử dụng sàn hoặc tRẦN chức năng:

SELECT li.QTY 
    FROM TABLE LI 
    WHERE li.QTY != FLOOR(li.QTY) 
; 
+2

Điều này đúng trừ khi anh ta muốn ** không ** toàn bộ số. Chỉ cần chuyển '=' thành '<>'. Anh ta có thể làm chính xác cùng một logic bằng cách sử dụng 'ROUND' và' CAST AS INT' ... chỉ cần tìm ra cái nào là nhanh nhất! – Matthew

+0

Tìm kiếm bất kỳ số nào có số thập phân – djshortbus

+0

Có, thnx. Hàm ROUND và CEILING sẽ hoạt động tương tự ở đây. Không chắc chắn nếu CAST như INT sẽ nhanh hơn, có lẽ không. –

3

Tại sao nó không làm việc. Khi QTY là một cột số, khi bạn hiển thị nó, hoặc ngầm chuyển đổi thành varchar (tương tự như nó ngầm định), TẤT CẢ các số sẽ được truyền tới cùng số chữ số thập phân.

Hãy xem xét câu lệnh SQL này

with TBL(qty) as (select 1.1 union all select 3) 
SELECT li.QTY FROM TBL LI WHERE li.QTY like '%.%' 

Output

1.1 
3.0 << this contains "." even if it does not need to 

Cast nó vào một bigint và nó sẽ thả bất kỳ số thập phân, sau đó so sánh nó một lần nữa.

SELECT li.QTY FROM TBL LI 
WHERE li.QTY <> CAST(qty as bigint) 


Nếu bạn PHẢI sử dụng LIKE (hoặc chỉ dành riêng cho chương trình ..)

SELECT li.QTY, CONVERT(varchar, li.qty) 
FROM TBL LI 
WHERE li.QTY LIKE '%.%[^0]%' 
+0

+1 để giải thích cho anh ta lý do tại sao 'LIKE' không hoạt động ở đây – Matthew

+1

+1 Bạn đã có tôi tại" Truyền nó đến một sự kiện lớn ";) – onedaywhen

1
--Most Def...Cast as an int...Save you from validation of anything. Especially for conversions of dates into a whole date since Microsoft does not like a round down date function. 

--For example: 

--For every 300 hours an employee works they receive 1 whole day of vacation 

--partial days of vacation will not be counted 

Declare 

@SumHours as decimal(38,10), 

@VacationValidation as int 

Set @SumHours = 3121.30000000000000000000 
Set @VacationValidation = 300 

Select cast(((@SumHours)/(@VacationValidation)) as int) 
Select day(((@SumHours)/(@VacationValidation))) -1 

--without casting as an int, I would need to validated the Day function to make sure that I'm not 

--offsetting a whole day by one day. 
0

CAST chức năng làm việc cho tôi.

SELECT li.QTY FROM TABLE LI WHERE li.QTY != CAST(li.QTY AS INTEGER) 
Các vấn đề liên quan