web-dev-qa-db-ja.com

変数を使用したクエリ

クエリ内から変数を設定/読み取ることは可能ですか?

擬似コード:

SELECT animal_name,
    @tallest_animal = (select top 1 height from animal order by height desc) as tallest,
    @smallest_animal = (select top 1 height from  animal order by height asc) as smallest
FROM animals
WHERE height BETWEEN @smallest_animal AND @tallest_animal

クエリを変えることで結果が得られることはわかっています。私の質問の実際の使用法を説明するのは難しすぎます。

問題のMicrosoftSQLServerです。 :)

8
freand

はい、クエリ内で変数を設定できます。あなたの構文は実際にはかなり近いです。

そのためには、次のものが必要です。

SELECT @YourVariable = Column
FROM Animals

注:フィールドを変数に割り当てるときにASを使用することはできません。

クエリのすべてのフィールドが変数に割り当てられていることを確認する必要があります。そうしないと、次のエラーが発生します。

変数に値を割り当てるSELECTステートメントは、データ取得操作と組み合わせてはなりません。

これを克服するには、AnimalNameを@AnimalName変数に割り当てるだけです。

編集:

DECLARE @AnimalName  VARCHAR(20)
DECLARE @TallestAnimal  INT
DECLARE @SmallestAnimal INT

SELECT @AnimalName = animal_name,
   @TallestAnimal  = (select top 1 height from animal order by height desc),
   @SmallestAnimal = (select top 1 height from  animal order by height asc) 
FROM animals
WHERE height BETWEEN @SmallestAnimal AND @TallestAnimal 

このコードは、高さフィールドがINT型であることを前提としています。

8
Darren

いいえ、できません。代わりに次のように使用してください。

DECLARE @tallest_animal int, @smallest_animal int
SET @tallest_animal=(SELECT max(height) from animals)
SET @smallest_animal=(SELECT min(height) from animals)
SELECT animal_name from animals where height between @tallest_animal AND @smallest_animal

このようなものは機能しますが、あなたが何を探しているのかわかりません。

5
Milee

変数の代わりに派生テーブルを使用できます。

select A.animal_name, M.tallest, M.smallest
from animals A
  inner join 
      (
        select max(height) as tallest,
               min(height) as smallest
        from animal
      ) M
    on A.height between M.smallest and M.tallest
5
Mikael Eriksson

Selectステートメントで変数に値を割り当てて同じSELECTステートメントで結果セットを返すことはできません。これはSQLServerの制限です。できたら素晴らしいと思いませんか!

単一のステートメントが必要な場合、なぜここで変数を使用したいのですか?次のことはあなたのために働きませんか?

WITH cte (tallest, smallest) AS (
    SELECT MAX(height), MIN(height) FROM animals
)
SELECT animal_name FROM animals, cte WHERE height BETWEEN smallest AND tallest

後でストアドプロシージャで変数を使用する場合は、2つのselectステートメントを使用するしかありません。1つは割り当て用、もう1つはselect用です。

DECLARE @tallest INT, @smallest INT
SELECT @tallest = MAX(height), @smallest = MIN(height) FROM animals
SELECT animal_name FROM animals WHERE height BETWEEN @smallest AND @tallest

ADOを使用する場合、ADOコマンドで複合クエリを使用できます。つまり、コマンドコンポーネントに複数のステートメントを含めることができるため、上記の両方のソリューションが機能することに注意してください。

1
Peter