mysql SQL条件:if else语句

3lxsmp7m  于 2022-11-21  发布在  Mysql
关注(0)|答案(1)|浏览(179)

我用这个特殊的例子
https://www.w3schools.com/sql/sql_orderby.asp
我想获取国家/地区名称以Fr开头的客户列表,如果Fr%中没有客户,则我想查找国家/地区以格尔开头的客户。如果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;

我收到错误“无法准备语句”。是否有最佳的方法来执行相同的操作。
谢谢你

ccrfmcuu

ccrfmcuu1#

注意:您将此问题标记为mySQL,但Northwinds数据库不是mySQL。例如,w3schools不支持ORDER BY FIELD,而mySQL支持ORDER BY FIELD,还有其他区别。
我不确定我是否会这样做。我想我会使用一个子查询,类似于:

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),因为该字段没有名称,因为我生成了它。我将其 Package 在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 Server下的托管代码,或支持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示例上不起作用,我也没有测试它,因为我必须导出数据库才能这样做。

相关问题