0

私のサイトでは、2種類の納期を保存する必要があります。契約納期と注文の調整納期。基本的に、契約日は注文時の製品の納期です。調整日は、より少ないまたはより大きな日付の調整者です。その後、契約日

表は次のようになります。

id   product_name  condeldat adjdeldate
----------------------------------------
1     drilling      2011-05    2012-01
2     lathe         2012-06

製品に調整日があるかどうかを確認してから、調整日を選択する必要があります。それ以外の場合は契約日を選択します。

以下のクエリで完了:

select id,
       product_name,
       if(adjdeldat is not NULL, adjdeldat, condeldat) as delivery_date     
 from orders

上記のクエリは正常に機能しますが、任意の配信日(if(adjdelcat is not NULL、adjdeldat、condetdat))>昨年(今のところ2011年になります)の製品を取得する必要があります。条項?

4

3 に答える 3

0

if elseを使用するのと同等の条件を作成する必要がありますANDOR

以下をお試しください:

SELECT id,product_name,if(adjdeldat is not NULL,adjdeldat,condeldat) as delivery_date 
FROM orders  
WHERE ((adjdeldat is NULL and left(condeldat) > 2011) OR left(adjdeldat) > 2011)

昨年を動的に取得するには、次を使用できます。

(left(curdate(),4)-1) in place of 2011
于 2012-04-07T17:04:50.113 に答える
0

表現を使用する:

 select id, product_name,
 if(adjdeldat is not NULL, adjdeldat, condeldat) as delivery_date     
 from orders  HAVING delivery_date BETWEEN 'beginDate' AND 'endDate'
于 2012-04-07T17:19:40.717 に答える
0

派生テーブル/インラインビューの使用:

SELECT x.id, x.product_name, x.delivery_date  
  FROM (SELECT o.id, o.product_name, IFNULL(o.adjdeldat, o.condeldat) AS delivery_date
          FROM ORDERS o) x
 WHERE x.delivery_date BETWEEN '2011-01-01' AND '2011-12-31' 
  • IFNULLをANSICOALESCEまたはCASEステートメントに置き換えることができます
  • 常に同じデータ型の値を比較してください。そうしないと、インデックスが存在する場合、クエリでインデックスを使用できません。
  • 操作によっては、オプティマイザが述語プッシュを使用して(この場合はあり得ない)、外部クエリのフィルタリングを内部クエリにプッシュする場合があります。
于 2012-04-07T17:21:25.677 に答える