我用这个特殊的例子
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;
我收到错误“无法准备语句”。是否有最佳的方法来执行相同的操作。
谢谢你
1条答案
按热度按时间ccrfmcuu1#
注意:您将此问题标记为mySQL,但Northwinds数据库不是mySQL。例如,w3schools不支持
ORDER BY FIELD
,而mySQL支持ORDER BY FIELD
,还有其他区别。我不确定我是否会这样做。我想我会使用一个子查询,类似于:
在本例中,我将使用
WHERE
将内部查询限制为仅包含这三个国家/地区,然后使用ORDER BY FIELD
按特定顺序对其进行排序,最后使用LIMIT 1
仅返回顶部记录。然后外部查询从表中选择国家/地区与返回的任何记录相匹配的所有内容。w3schools似乎不支持
ORDER BY FIELD
,所以你可以做一些类似的事情,但是稍微笨拙一点:在本例中,我使用
CASE WHEN
生成国家/地区的排序顺序,然后使用ORDER
按该列排序,在本例中使用2(对于字段2),因为该字段没有名称,因为我生成了它。我将其 Package 在select中,因为否则它将返回两个字段,并且子查询(WHERE Country IN
)只需要传递一个参数。这就是你所期待的结果吗?
在northwinds示例数据库中,使用LIKE:
这在mySQL(或SQL Server下的托管代码,或支持REGEX的其他rdms)中会得到简化:
这个使用REGEXP的示例在w3schools的Northwinds示例上不起作用,我也没有测试它,因为我必须导出数据库才能这样做。