4

英数字コードを含むテーブルが1つあります。この特定の例では、私は本質的に英数字であるコードには関心がなく、整数を含むコードのみに関心があります。必要なコードのサブセットを見つけるために、小さなクエリを作成しました。

 select CAST(icd as float) as icd

from
(
select i.icd
    from icd as i
    where icd like '952%' or icd like '806%' or icd like '3440%' or icd like '3441'
)t

これにより、必要なコードのリストが返されます。ただし、次のようなwhere句を使用しようとすると次のようになります。

where icd between 80600 and 80610クエリが失敗し、varcharデータ型をintに変換できないことを通知します。しかし、私が次のようなことをすると

select CAST(icd as float) as icd,icd+10

from
(
select i.icd
    from icd as i
    where icd like '952%' or icd like '806%' or icd like '3440%' or icd like '3441'
)t

各コードに10を追加すると、実行されます。つまり、実際には整数です。コード80600-80610にはXのラベルを付け、80611-80620にはYのラベルを付ける必要があるため、このような句を使用しますwhere。コードごとに手動でこれを行うことができますが、それよりも拡張性が高くなります。

このwhere句を使用するときに、SQL Serverが失敗するのではなく、派生テーブルのみを参照するようにするにはどうすればよいですか?

4

3 に答える 3

3

内部クエリはおそらくvarcharフィールドを返しています。走れますか

select i.icd
from icd as i
where icd like '952%' or icd like '806%' or icd like '3440%' or icd like '3441'

文字列データが返されていないことを確認しますか?

参考までに、内部クエリを使用しているため、追加できます

WHERE IsNumeric(t.icd ) = 1 

整数のみが返されることを確認するため

于 2012-10-23T13:54:13.357 に答える
1

結果がキャストされる前にフィルターが実行されます

あなたがしているのは、クエリの実行時に列の値ではなく結果をキャストすることです(そしてすべてのフィルタリングを行います)。フィルタ(where句)は、結果値がキャストされる前に評価されます。

例で示したのと同じ結果セットを引き続き使用するには、サブクエリの代わりにCTEを使用してから、追加のフィルタリングを実行するのが最も簡単な方法です。

with codes as (
    select cast(icd as int) as icd
    from icd
    where icd like '952%' or
          icd like '806%' or
          icd like '3440%' or
          icd like '3441'
)
select icd, 'X' as label
from codes
where icd between 80600 and 80610
union all
select icd, 'Y'
from codes
where icd between 80611 and 80620

CTEがサブクエリよりも読みやすいかどうかは、果てしない議論/議論の問題です。ただし、同じテーブル式を再利用してXおよびYラベルの結果を取得する場合、サブクエリで同じことを行う場合に必要なコードと比較して、使用するコードが少なくなります。この場合、はるかに読みやすくなります。

もちろん、キャストするデータは数値でなければなりません

データをキャストするときは、実際に結果タイプにキャストできることを確認する必要があります。あなたの値が064 Vこれである場合、これは明らかに数値ではないため、キャストできません。への呼び出しisnumericはここで役立ちます:

with codes as (
    select cast(icd as int) as icd
    from icd
    where isnumeric(icd) = 1 and
          (
              icd like '952%' or
              icd like '806%' or
              icd like '3440%' or
              icd like '3441'
          )
)
select icd, 'X' as label
from codes
where icd between 80600 and 80610
union all
select icd, 'Y'
from codes
where icd between 80611 and 80620
于 2012-10-23T13:53:25.063 に答える
1

whereフィルターがICDを文字列(文字列)として処理することを確認してから、数値に変換可能なICDのみをフィルター処理する必要があります。

特筆すべきは、文字列の比較では数値の「長さ」に注意する必要があることです(たとえば、「8061」は「80600」と「80610」の間にあります)が、幸いなことに、フィルタは次の範囲内にあるようです。長さは一定です。

例えば

where icd between '80600' and '80610' -- i.e. exclude '12345' and 'Apple'
      and length(icd) = 5             -- i.e. exclude '8061' and '806000001'
      and isnumeric(icd) = 1          -- i.e. exclude '8060A' 
于 2012-10-23T13:54:24.987 に答える