2009-07-18 10 views
6

私は数値比較

「totalexp」ヘルプn個のクエリを必要と私は値を持つテーブル に... 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のようなものが表示されないようにしてください。

+0

が最初にintに列を変換する作業をテストしています。それはそのようにより適切です。 –

+0

質問に説明を含めると痛いですか? –

+0

totalexp列に「mon」、「yrs」、「+」などがあるとしますか?フィルタリングするときに、出力に「6.3」と「64 mon」が必要なのか、真の整数/数値データだけが必要ですか? – gbn

答えて

2

おそらくwhere節の比較のために、 'totalexp'はnvarcharではなく数字フィールド(intなど)である必要があります。番号を格納するためにnvarcharを使うのは良い考えではありません。

+0

はい、あなたは正しいですが、これはビジネスで使用されている古いテーブルですが、今はその条件に基づいてフィルタリングする必要があります。そこには何もありません。 –

7

列の種類を変更できない場合は、比較を行う前にCAST or CONVERTを使用する必要があります。あなたのコードは次のようになります。

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

警告のビット:あなたの現在のDB構造で、誰もが「ひとつ」または「二」または他の任意の文字列としてTotalExpを挿入することができ、およびクエリが失敗します。真剣に起こってほしくないことです。

3

カラムデータを標準化するために、データクリーニングの練習を行うことをお勧めします。現在、1つの列に複数のフォーム/データ標準があります。


あなたは、あなたが列データをテストするために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; 
+0

...数字以外のデータでは失敗します。 – gbn

+0

@gbn:もちろんですが、私は誰のためにも、それは言うまでもありません。しかし、わかりやすくするために、元の投稿を修正して数値データをテストするようにしました –

+0

私はフォークがこれを選ぶとは決して想像できませんでした...私は要件がまだ漠然としていると思います。 OPは実際に何をフィルタリングしたいのですか? – gbn

2

句は整数にtotalexpの種類を変更するにはどこにCast or Convertを使用してみてください。それは "6ヶ月"、 "6年" であってもよいデータが含まれているよう

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

...数値以外のデータでは失敗します – gbn

5

混乱は

where totalexp > '6' 
の背後にある意図とは何か "6 +歳" など、TotalExpはnvarchar型であることから始まります

? 6年6ヶ月65日?

データを数値形式に変換する必要があります。たとえば、いくつかの要件(「月間の経験」)と比較できる数ヶ月などです。

しかし、1年では、あなたのデータは変更されないので時代遅れになるでしょう。ただし、現在「6歳」と書かれているすべてのTotalExpは「7年」になります(スキルがその間)。

アクティブスキルの場合、結果の「トータルエクスペリエンス」が常に最新であるという素晴らしい効果を持つExperienceSince DATETIMEフィールドを持つことが望ましいでしょう。

2

私は質問が非常に古いことを知っています。 一部の人には役立つかもしれないので、回答を投稿するだけです。

次のコードは、他の行に数値以外の値が存在する場合に使用できます。

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

コードが

+0

答えを編集していただきありがとうございますjHilscher – Shammas

+1

私は間違っているかもしれませんが、ゼロと比較すると "ELSE 0"(最後の行)が間違った結果を引き起こす可能性があります。たぶんあなたは代わりに "ELSE NULL"を使うべきでしょう。 –