SQL Поиск числового поля для не целых чисел - PullRequest
8 голосов
/ 08 февраля 2011

У меня есть БД с числовым полем, и мне нужно найти все строки и вернуть только не целые числа.

Я пробовал запрос ниже, и он продолжает перенастраивать записи, которые имеют 0.

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

Ответы [ 4 ]

12 голосов
/ 08 февраля 2011

Вы можете использовать LIKE только с символьными полями, а не с числовыми (целыми или с плавающей точкой).

Если под «целыми числами» вы подразумеваете 0,0, 2,0, -5,0 и т. Д., А не 12,5, 0,67, то это может сделать:

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

(для SQL-сервера: отредактировал TRUNC в ROUND) Вы также можете использовать функции ПОЛ или ПОТОЛОК:

SELECT li.QTY 
  FROM TABLE LI 
  WHERE li.QTY != FLOOR(li.QTY)
;
3 голосов
/ 08 февраля 2011

Почему это не работает. Когда QTY - это числовой столбец, когда вы отображаете его или неявно преобразуете в varchar (LIKE делает это неявно), ВСЕ числа будут приводиться к одинаковому числу десятичных знаков.

Рассмотрим этот оператор SQL

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

выход

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

Приведите его к bigint, и он отбросит все десятичные дроби, затем сравните его снова.

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


Если вы ДОЛЖНЫ использовать LIKE (или просто для показа ..)
SELECT li.QTY, CONVERT(varchar, li.qty)
FROM TBL LI
WHERE li.QTY LIKE '%.%[^0]%'
1 голос
/ 20 декабря 2011
--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 голосов
/ 03 марта 2015

CAST функция работает для меня.

SELECT li.QTY FROM TABLE LI WHERE li.QTY != CAST(li.QTY AS  INTEGER)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...