0

テーブル内の 2 つの値の時間差を取得し、すべての NULL を排除しようとしています。

SELECT NumberOfMinutes =
   DATEDIFF(millisecond, tbl_hugo_game.time_start, tbl_hugo_game.time_end)
FROM tbl_hugo_game 
WHERE numberofminutes <> NULL 
ORDER BY numberofminutes ASC

WHERE-clause がなければ正常に動作します。それ以外の場合:

メッセージ 207、レベル 16、状態 1、行 3 列名 'numberofminutes' が無効です。

どうしたの?

4

3 に答える 3

4

where句で列の別名を使用することはできません。

ただし、次のように、別のクエリのソースとしてエイリアスを使用してクエリを配置できます。

select * from (
  select DATEDIFF(...) AS NumberOfMinutes 
  FROM tbl_hugo_game) source
where NumberOfMinutes is not null 
order by NumberOfMinutes asc 
于 2012-12-26T14:33:43.543 に答える
0

句が列エイリアスにアクセスできない場合。あなたのケースでは、(副選択を使用せずに)クエリを次のように書き直す方が適切で簡単です。

SELECT NumberOfMinutes =
DATEDIFF(millisecond, tbl_hugo_game.time_start, tbl_hugo_game.time_end)
FROM tbl_hugo_game 
WHERE tbl_hugo_game.time_start  IS NOT NULL AND tbl_hugo_game.time_end IS NOT NULL
ORDER BY numberofminutes ASC
于 2012-12-26T16:01:11.087 に答える
0

この SELECT ステートメントの論理的な処理順序は次のとおりです。

a)FROM tbl_hugo_game

b)WHERE numberofminutes <> NULL

c)

SELECT
DATEDIFF(millisecond ,tbl_hugo_game.time_start,tbl_hugo_game.time_end) AS NumberOfMinutes

d)ORDER BY numberofminutes ASC

したがって、ステップ c) (DATEDIFF ... AS NumberOfMinutes 計算フィールドを持つ SELECT 句) は、ステップ b) (WHERE 句) の後、ステップ d) (ORDER BY 句) の前に処理されます。これが、手順 c) の計算フィールド (DATEDIFF ... AS NumberOfMinutes) を WHERE 句 (手順 b) では使用できないが、ORDER BY 句 (手順 d) では使用できる理由です。

参考文献: SELECT (Transact-SQL) # SELECT文の論理処理順序

次の手順は、SELECT ステートメントの論理的な処理順序 (バインド順序) を示しています。この順序により、あるステップで定義されたオブジェクトが後続のステップの句でいつ使用可能になるかが決まります。たとえば、クエリ プロセッサが FROM 句で定義されたテーブルまたはビューにバインド (アクセス) できる場合、これらのオブジェクトとその列は、後続のすべてのステップで使用できるようになります。逆に、SELECT 句は手順 8 であるため、その句で定義された列の別名または派生列は、前の句で参照できません。ただし、ORDER BY 句などの後続の句で参照できます。ステートメントの実際の物理的な実行はクエリ プロセッサによって決定され、順序はこのリストと異なる場合があることに注意してください。

  1. から
  2. オン
  3. 加入
  4. どこ
  5. グループ化
  6. WITH CUBE または WITH ROLLUP
  7. 持っている
  8. 選択する
  9. 明確
  10. オーダーバイ
于 2012-12-26T15:06:31.627 に答える