簡體   English   中英

SQL 條件:if else 語句

[英]SQL condition : if else statement

我正在使用這個特定的例子

https://www.w3schools.com/sql/sql_orderby.asp

我想獲取國家名稱以 Fr 開頭的客戶列表,如果 Fr% 中沒有客戶,那么我想在以 Ger 開頭的國家中尋找客戶,如果 Ger% 中沒有客戶,我想尋找客戶以 Au% 開頭的國家。

CREATE PROCEDURE cusBycon
AS
IF (SELECT COUNT(*) FROM Customers WHERE Country = "France") == 0 
BEGIN 
   IF (SELECT COUNT(*) FROM Customers WHERE Country = "Germany") = 0 
   BEGIN
       SELECT * FROM Customers WHERE Country = "Australia" as Country
   END
   ELSE
   BEGIN
       SELECT * FROM Customers WHERE Country = "Germany" as Country
   END
END
ELSE
BEGIN
       SELECT * FROM Customers WHERE Country = "France" as Country
END
GO;


EXEC cusBycon;

我收到錯誤“無法准備聲明”。 是否有執行相同操作的最佳方法。

謝謝

注意:您將此問題標記為 mySQL,但 Northwinds 數據庫不是 mySQL。例如,w3schools 不支持ORDER BY FIELD ,而 mySQL 支持,除此之外還有其他差異。


我不確定我會這樣 go 。 我想我會使用的是一個子查詢,像這樣:

SELECT * FROM Customers WHERE Country IN (
  SELECT Country FROM Customers
  WHERE Country IN ('France', 'Germany', 'Australia')
  ORDER BY FIELD(Country, 'France', 'Germany', 'Australia')
  LIMIT 1
)

在這種情況下,我將使用WHERE將內部查詢限制為僅這三個國家/地區,然后我使用ORDER BY FIELD按特定順序對其進行排序,最后使用LIMIT 1僅返回最高記錄. 然后,外部查詢從表中選擇國家/地區與返回的內容匹配的所有內容。

我說這樣的話是因為我無法測試它。 w3schools 似乎不支持ORDER BY FIELD 所以你可以做一些類似但更笨重的事情:

SELECT * FROM Customers WHERE Country IN (
  SELECT Country FROM (
    SELECT Country, 
      CASE WHEN Country = 'France' THEN 1 
        WHEN Country = 'Germany' THEN 2 
        ELSE 3 END
    FROM Customers 
    WHERE Country IN ('France', 'Germany', 'Australia')
    ORDER BY 2 LIMIT 1
  ) z
)

在此示例中,我使用CASE WHEN為國家/地區生成排序ORDER ,然后按該列對它們進行排序,在本例中使用 2(對於字段 2),因為該字段沒有名稱,因為我生成了它。 我將其包裝在 select 中,否則它將返回兩個字段,並且子查詢 ( WHERE Country IN ) 只需要一個參數傳遞給它。

這是你期待的結果嗎?


反映您對問題的最新編輯的版本,在 northwinds 示例數據庫中,使用 LIKE:

SELECT * FROM Customers WHERE Country IN (
  SELECT Country FROM (
    SELECT Country, 
      CASE WHEN Country LIKE 'Fr%' THEN 1 
        WHEN Country LIKE 'Ger%' THEN 2 
        ELSE 3 END
    FROM Customers 
    WHERE (Country LIKE 'Fr%')
    OR (Country LIKE 'Ger%')
    OR (Country LIKE 'Au%')
    ORDER BY 2 LIMIT 1
  ) z
)

這將在 mySQL(或 SQL 服務器下的托管代碼,或另一個支持 REGEX 的 rdms)中得到簡化:

SELECT * FROM Customers WHERE Country IN (
  SELECT Country FROM (
    SELECT Country, 
      CASE WHEN Country LIKE 'Fr%' THEN 1 
        WHEN Country LIKE 'Ger%' THEN 2 
        ELSE 3 END
    FROM Customers 
    WHERE Country REGEXP '^(Fr|Ger|Au%)'
    ORDER BY 2 LIMIT 1
  ) z
)

這個使用 REGEXP 的示例不適用於 w3schools 的 Northwinds 示例,我也沒有測試它,因為我必須導出數據庫才能這樣做。

暫無
暫無

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

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