3

是否可以在 SQL 中使用 if/else?如果我有一个名为supplier列的表:sid-> 主键,sname并且city.

然后我希望:

  1. select sid from supplier where city="taipei"如果不为空。
  2. 或者select sid from supplier where city="tainan"
4

3 回答 3

4

是的你可以。我不知道其他 DBMS,但我在我的存储过程中的 Microsot SQL Server 中使用过这样的东西;

IF EXISTS
   (SELECT [sid] FROM [supplier]  WHERE [city]= "taipei")

select sid from supplier where city="taipei"  // your true condition query
ELSE
select sid from supplier where city="tainan"

在 MySQL From this link中,事实证明这也是可能的。看;

IF EXISTS(SELECT * FROM tbl_name WHERE category_code ='some-category-code') THEN UPDATE tbl_name SET active='0' WHERE category_code = 'some-category-code' END IF
于 2012-08-21T09:33:52.783 回答
1

目前还不清楚你想做什么(我把我之前的假设留在下面)。

您想将优先级关联到您的供应商,以便选择台北的供应商,但如果它不可用,则选择台南。

在这种特定情况下,您可以使用:

SELECT sid FROM supplier WHERE city = (
    SELECT MAX(city) FROM supplier WHERE city IN ('Taipei', 'Tainan')
);

内部子 SELECT 将检索台北,如果不可用,则检索台南。

这利用了台北在字典上大于台南的事实,但是如果您想要更灵活的解决方案,MAX 将无法工作。在这种情况下,您将更改子选择以按可取的顺序对城市进行排序(丢失的城市当然是不可取的),然后获取最可取的一个:

SELECT sid FROM supplier WHERE city = (
    SELECT city FROM supplier ORDER BY CASE
        WHEN city = 'Taipei' THEN 1
        WHEN city = 'Tainan' THEN 2
        WHEN city = 'New York' THEN 3
        ELSE 4
     END
     LIMIT 1
);

现在的子选择将首先检索台北,但缺少台北它将到达台南等等。

请注意,如果您只需要一个 SID,则可以更简单地执行此操作:

SELECT sid FROM supplier ORDER BY CASE
        WHEN city = 'Taipei' THEN 1
        WHEN city = 'Tainan' THEN 2
        WHEN city = 'New York' THEN 3
        ELSE 4
     END
     LIMIT 1

这将检索所有供应商,但台北的供应商(如果有)将首先出现;并且 LIMIT 1 将截断对该第一行的响应。

以下解决方案不适用

这将从城市为台北或台南的供应商处获得 sid(这当然意味着该城市不是空的!):

SELECT sid FROM supplier WHERE city IN ('Taipei', 'Tainan');

如果 sid 不为空,这将从供应商那里获得 sid:

SELECT sid FROM supplier WHERE city IN ('Taipei', 'Tainan') AND sid IS NOT NULL;

这将从上面的供应商处获取 sid,如果 sid 为空,则替换它。

SELECT CASE WHEN sid IS NULL then 'Empty' ELSE sid END AS sid
    FROM supplier WHERE city IN ('Taipei', 'Tainan');

也许您应该提供两三个具有预期结果的示例行。

编辑:对不起,我现在看到 sid 是一个主键,这意味着它永远不应该为空。这意味着案例 2 和 3 永远不会适用。

那么也许您的意思是sname不为空?:

SELECT sid FROM supplier WHERE city IN ('Taipei', 'Tainan')
    AND sname IS NOT NULL AND sname != '';
于 2012-08-21T09:30:06.230 回答
0

以下选择台北有供应商,否则选择台南供应商。如果它们都不存在,则不会返回任何内容。

select sid
from supplier
where city = 'Taipei'

union all

select sid
from supplier
where city = 'Tainan' 
  and not exists (select 1 from supplier where city = 'taipei')
于 2012-08-21T09:38:49.053 回答