是否可以在SQL中使用if / else?如果我有一个名为supplier
的表格,其列为sid
- >主键,sname
和city
。
然后我希望:
select sid from supplier where city="taipei"
如果不是空的话。select sid from supplier where city="tainan"
答案 0 :(得分: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中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
答案 1 :(得分: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 != '';
答案 2 :(得分: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')