簡體   English   中英

SQL根據條件不同的SELECT

[英]SQL different SELECT based on condition

我有帶有“分數”列的SQL表。 有時該表將具有數百行,有時則將少於10行。 我需要一個SQL查詢,如果少於10行,則輸出前3個得分;如果表中有10個以上得分,則輸出前10個得分。

我不確定如何在SQL中執行此操作,但是類似以下內容:

SELECT
  CASE
    WHEN COUNT(*) < 10 THEN
      (
       SELECT score 
       FROM scores_table 
       ORDER BY score DESC 
       LIMIT 3
      )
    WHEN COUNT(*) > 10 THEN 
      (
       SELECT score 
       FROM scores_table 
       ORDER BY score DESC 
       LIMIT 10
      )
  END

上面的方法不起作用,但希望它能傳達我想要得到的。

我認為這可以滿足您的需求:

(
 SELECT `score`
 FROM `scores_table`
 ORDER BY `score` DESC
 LIMIT 3
) 
UNION ALL
(
 SELECT `score`
 FROM `scores_table`
 WHERE (SELECT COUNT(*) FROM `scores_table`) >= 10
 ORDER BY `score` DESC
 LIMIT 2, 7
)

試試這個查詢!

SELECT `score`
 FROM `scores_table`
 WHERE COUNT(*) <= 10
 ORDER BY `score` DESC
 TOP 3

UNION 

SELECT `score`
 FROM `scores_table`
 WHERE COUNT(*) < 10
 ORDER BY `score` DESC
 TOP 10

這個問題很有趣。

當您選擇標簽“ MySQL”時,您可能對我提出的答案沒有直接的興趣,但是總有一天有人會發現它很有用。

我在已經發布的其他兩個答案中看到的問題是,它們使用的不是SQL的“ LIMIT”或“ TOP”。 以下查詢僅使用標准SQL。 這個想法是先獲取第三和第十個分數,然后獲取分數表中高於其中一個分數的每一行。

WITH RN(score, rn) AS (
  SELECT score, row_number() OVER (ORDER BY score DESC)
  FROM score
),
BOUND(bound) AS (
  SELECT min(score)
  FROM RN
  WHERE rn IN (3, 10)
)
SELECT score.*
FROM score
INNER JOIN BOUND ON score >= bound
ORDER BY score DESC;

SQL提琴: http ://sqlfiddle.com/#!17/ b44b8/2/0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM