2017-02-20 8 views
-1

私は従業員のテーブルと、ユーザーがSELECTのために使用できるクエリ基準を表示するプログラムを持っています。たとえば、従業員(またはそのセット)を従業員しかし、IDの範囲を選択して検索させるようにしました。注文した値の間

この実装ではDBは、IDの文字列値を保持し、彼らはこのようになりますように

「000001」、「000002」....「000200」と、彼らはまた、ある文字列であることながら、数字。だから私はこのようなクエリ作るとき:

select * from employees where id_employee BETWEEN '000001' AND '000056' 

を私が期待する結果を得るが、私はこれを行うとき:

select * from empleados where id_empleado BETWEEN '000056' AND '000001' 

を私は何を取得SQLServerのは、治療されているかのように、それが思われますvalusを整数値または小数点値として返し、結果を得ることができません。

私は使用している基準ウィンドウで検証を行うことができましたが、この基準ウィンドウの約100を変更する必要がないDBなどのデフォルトを作成する方法があるかどうかは疑問でした。

ありがとうございます。

EDIT:私はBETWEEN演算子の機能を主張するのではなく、むしろSQLServerに使用するべき方法を指示することによってそれを使用する方法を探していますか?

+0

質問... ?そのようにする必要がありますので、適切なINT non nullable値にしてください。私が正しく理解していれば、これらの値をnvarcharにキャストして、正常に動作させる必要があります。 – User987

+1

[BETWEEN句と対比すると、<= AND > =]となる可能性があります(http://stackoverflow.com/questions/4809083/between-clause-versus- and) –

+0

@ User987私はDB管理者ではなく、ただプログラマーです。私がここで働き始めたときには既にこのようになっていました。大きなプログラムですので、変更するつもりはないと思います。すべてのFKはほとんどが文字列です。 –

答えて

0

BETWEENは常に<smaller value> AND <larger value>を期待する予定です。値を逆にすると(<larger value> AND <smaller value>)、問題が発生します。

あなたはパラメータ化クエリを(強く推奨)を使用している場合は、あなたはあなたのクエリを意味パラメータとしてクエリへのユーザーの選択肢を渡し基準ウィンドウは次のようになりますしている:

SELECT * from employees WHERE id_employee BETWEEN :Parameter1 AND :Parameter2 

これがあれば

SELECT * 
FROM employees 
WHERE id_employee 
    BETWEEN 
    CASE 
     WHEN :Parameter1 >= :Parameter2 
      THEN :Parameter2 
     ELSE :Parameter1 
    END 
    AND 
    CASE 
     WHEN :Parameter2 <= :Parameter1 
      THEN :Parameter1 
     ELSE :Parameter2 
    END 
; 

これは、次のとおりです。ケースは、あなたが大きく、その1小さいので、問題を解決している1つのチェック、パラメータのCASE比較を実行するために、あなたのクエリを変更することによって、問題を解決することを期待することができますほんの一例あなたがこれを書く方法については、私はあなたがそのアイデアを得るだろうと思っています。このクエリでは、:Parameter1 = '00056':Parameter2 = '00001'を書くかどうかは関係ありません。どちらの方法でも、返される結果は同じになります。

すべての単一条件ウィンドウが同じ基本ロジックを使用している場合は、それぞれの条件ウィンドウで同じ変更を避けることはできません。

しかし、これは、ストアドプロシージャなどの集中クエリを使用して作業を節約する方法の良い例です。すべての条件ウィンドウがストアドプロシージャまたは同様の保存クエリを実行していた場合、その1つのセントラルクエリを更新するだけで、すべてのウィンドウが正しく動作するようになります。

しかし、各ウィンドウで独自の動的クエリが実行されている場合は、ウィンドウ単位でウィンドウを移動してこの機能を変更するというオプションはありません。

+0

実際にプログラムがパラメータ化されたクエリを持っていて、すべてのウィンドウに対してdynamycクエリを使用し、何がERPであるのかが分からない場合、これは私の問題の素晴らしい解決策になります。だからええ、あなたはこれらの質問のうちどれくらいがそこにあるのかを描くことができます。御時間ありがとうございます! –

+0

@DavidMerinos私を信じて、私はあなたの痛みを感じる。 – 3BK

0

ここに表示されている形式でFKを保存したいと思うのは少し奇妙です。この作品を作るために私は、クエリのようにあなたのFKのための整数値を使用して、簡単に行うことを示唆している:

select * from empleados where id_empleado BETWEEN 56 AND 1 
0

を使用すると、結果は同じである数値を使用する場合でも。 SQLはbetween v1 and v2>= v1 and <= v2と変換します。

declare @emp table (id varchar(10), id2 int); 
insert into @emp values 
('0001',1), 
('0002',2), 
('0010',10), 
('0020',20), 
('0030',30), 
('0040',40); 

select * from @emp where id between '0010' and '0030' 
select * from @emp where id between '0030' and '0010' 

select * from @emp where id2 between 10 and 30 
select * from @emp where id2 between 30 and 10 

あなたはint型にキャストすることができます:

select * from @emp where cast(id as int) between 10 and 30 

をしかし、結果は同じです。

は、ここでそれを確認してください:http://rextester.com/IDYU18650

+0

私は彼が間違いなく彼のテーブルのFKのタイプを変えるべきだと思います。 FKのこのデータ型は完全に間違っています。特に、彼が保持している形式では、 '0000056'です。 – User987

+0

私は結果が同じであることを認識しています。与えられた引数の順序を無視し、大きな値に対してマイナー値を使用してクエリを実行するようにSQLServerに指示する方法はありますか? –

+1

@DavidMerinosいいえ、ありません。 SQL Serverではなく、Oracleではなく、MySqlまたはPosgreSQLで使用されます。これはデフォルトのANSI SQLです.BETWEENは、test_expressionの値がbegin_expressionの値以上でend_expressionの値以下であればTRUEを返します。 – asemprini87

0

方法に関する:(文字列として定義される)2つのparm LIM1とLIM2とPowerBuilderの言語で

select * from employees where (id_employee BETWEEN '000001' AND '000056') or (id_employee BETWEEN '000056' AND '000001') 

:地球上であなたは文字列値としてFKを保存しないのはなぜ

select * from employees where (id_employee BETWEEN :lim1 AND :lim2) or (id_employee BETWEEN :lim2 AND :lim1) 
関連する問題