Числовые сравнения на строковом столбце данных - PullRequest
7 голосов
/ 18 июля 2009

мне нужна помощь n запрос

"totalexp" - это поле nvarchar ... в таблице и мне нужно выбрать, как показано ниже

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

У меня есть значения, такие как 11, 12, 21, и все эти вещи не отображаются

Ответы [ 6 ]

8 голосов
/ 18 июля 2009

Если вы не можете изменить тип столбца, вы должны использовать CAST или CONVERT перед выполнением сравнения. Ваш код будет:

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

Небольшое предупреждение : с вашей текущей структурой БД любой может вставить TotalExp как «Один» или «Два» или любую другую произвольную строку, и ваш запрос не будет выполнен. Серьезно, не то, что ты хочешь случиться.

5 голосов
/ 18 июля 2009

Беспорядок начинается с TotalExp, являющегося nvarchar, так как он содержит данные, которые могут быть «6 месяцев», «6 лет», «6+ лет» и т. Д. Какова цель

where totalexp  > '6'

? 6 лет, 6 месяцев, 65 дней?

Вам необходимо преобразовать данные в числовой формат, например, количество месяцев, которое вы можете сравнить с каким-либо требованием (как «месячный опыт»).

Однако через один год ваши данные устареют, так как они не изменятся, как вы бы это сделали, за исключением того, что каждый TotalExp, который теперь сообщает «6 лет», должен быть «7 лет» (если этот навык практиковался в то же время ).

Так что для активных навыков было бы предпочтительнее иметь поле ExperienceSince DATETIME, которое имеет приятный эффект, что его итоговый "общий опыт" всегда актуален.

3 голосов
/ 06 октября 2017

Я знаю, что вопрос очень старый. Просто отправьте ответ, потому что это может быть полезно для кого-то.

Приведенный ниже код можно использовать в сценариях, где существуют нечисловые значения для других строк.

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

Код проверен работающим

3 голосов
/ 18 июля 2009

Моя основная рекомендация для вас - выполнить очистку данных, чтобы стандартизировать данные столбца. В настоящее время существует несколько форм / стандартов данных в одном столбце.


Однако, если вы хотите полностью игнорировать символьные данные, то для учета значений столбцов, которые не преобразуются естественным образом в целое число, можно использовать функцию isnumeric () для проверки данных столбцов на числовые. *

Подробнее см. В следующем примере:

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;
2 голосов
/ 18 июля 2009

Попробуйте использовать Cast или Convert в предложении where, чтобы изменить тип totalexp на целое число.

SELECT EmpId,FirstName,totalexp
 FROM sample
 WHERE  CONVERT(int ,totalexp) > 6
2 голосов
/ 18 июля 2009

Возможно, totalexp должен быть числовым полем (int и т. Д.), А не nvarchar для сравнения в предложении where для работы. Использование nvarchar для хранения чисел не очень хорошая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...