2

次のような基本的なものがあるとしましょう

SELECT IF( (1 + 2) >=0, (1 + 2), 0)
FROM DUAL

これは明らかに 3 を返します。

返したいクエリを繰り返さない方法はありますか (ここでは 1 + 2)?

コンテキストに入れると、当月に実行する残りのタスクの数を返したい (少なくとも 4 つを実行する必要があります) が、4 つを超えるタスクが既に実行されている場合は、それ以上実行する必要がないため、次のように返します。 0.

私がやったことは

IF((4 - IFNULL((LONG QUERY RETURNING THE NUMBER OF TASKS DONE THIS MONTH FOR A PARTICULAR USER ),0)) >= 0,
(4 - IFNULL((LONG QUERY RETURNING THE NUMBER OF TASKS DONE THIS MONTH FOR A PARTICULAR USER ), 
0)

しかし、クエリが長く、サーバーに同じクエリを2回実行させたくないので、クエリを繰り返さない方法はありますか?

4

3 に答える 3

1

ワンステートメントソリューション

MySQL でこの問題を解決する方法は、負荷の高いクエリの出力を保存して、複数回再利用することです。ここを見てください:

SELECT CASE 
  WHEN @Value - 4 > 0 
  THEN @Value ELSE 0 
  END
FROM (SELECT @Value := (SELECT 1)) Query

ここで、«SELECT 1» はクエリに置き換える必要があります。

OT

クエリを実行する別の方法では、CTE (Common Table Expression) のサポートが必要になります。

この機能がMySQLにないことを私が知っていることについて(MSSQL CTEクエリをMySQLに変換する方法は?

CTE が利用可能な MSSQL での表現力を味わうために、次のように書くことができます。

with Query (value) 
as
(
    select 1
 )
select 
  case
    when (select value from Query) - 4 > 0
      then (select value from Query)
    else
      0
  end

実際、特に再帰関係を扱う場合、CTE はより強力です。

于 2013-08-08T14:11:37.447 に答える