[英]SQL - Conditional Where statement
I have the following table and data: 我有以下表格和数据:
DECLARE @Temp TABLE (id int, city varchar(10), ref varchar(10))
INSERT INTO @Temp (id, city, ref)
SELECT 1, 'London', 'GBP' UNION ALL
SELECT 2, 'London', 'EUR'
SELECT *
FROM @Temp
WHERE ((city = 'London' AND ref = 'GBP') OR (city = 'London' AND ref <> 'GBP'))
This returns: 返回:
1 London GBP
2 London EUR
What I would like to do is to check for where city = 'London' AND ref = 'GBP' first, if there is no row qualifying this then check if the city is London and ref can be anything, tried using case when but did not quite work. 我想做的是首先检查city ='London'和ref ='GBP'的地方,如果没有行符合条件,则检查城市是否是伦敦,ref是否可以是任何东西,请尝试使用case when不太工作。
In this scenario I should only get the row #1. 在这种情况下,我应该只获得第一行。
Thanks 谢谢
Just return the rows not containing GBP when there are no GPB rows, using NOT EXISTS
: 如果没有GPB行,只需使用
NOT EXISTS
返回不包含GBP的行:
SELECT *
FROM @Temp
WHERE (city = 'London' AND ref = 'GBP') OR (city = 'London' AND NOT EXISTS (SELECT *
FROM @Temp
WHERE city = 'London' AND ref = 'GBP'))
If you are dealing with single record, then next should work: 如果您正在处理单个记录,那么下一个应该工作:
SELECT TOP 1 *
FROM @Temp
WHERE city = 'London'
ORDER BY CASE WHEN ref = 'GBP' THEN 0 ELSE 1 END
SELECT *
FROM @Temp
WHERE city = 'London' AND ref = 'GBP'
UNION
SELECT *
FROM @Temp
WHERE NOT EXISTS (
SELECT *
FROM @Temp
WHERE city = 'London' AND ref = 'GBP'
) AND city = 'London'
SELECT
after UNION
is conditional where. UNION
之后的SELECT
在哪里有条件。
You can use CASE WHEN
: 您可以使用
CASE WHEN
:
SELECT *
FROM @Temp
WHERE
CASE
WHEN city = 'London' AND ref = 'GBP' THEN 1
WHEN city = 'London' AND ref <> 'GBP' AND NOT EXISTS(SELECT 1 FROM @Temp
WHERE city = 'London'
AND ref = 'GBP') THEN 1
ELSE 0
END = 1
select city, max(ref)
from @Temp
group by city
Alternatively 另外
select city, ref
from @Temp t1
where t1.ref = 'GBP'
or not exists (select 1 from @Temp t2
where t2.city = t1.city
and t2.ref = 'GBP')
You can try with NOT EXISTS
something like: 您可以尝试使用
NOT EXISTS
东西:
SELECT *
FROM @Temp
WHERE ((city = 'London' AND ref = 'GBP') OR (city = 'London' AND ref <> 'GBP'
AND NOT EXISTS (SELECT *
FROM @Temp
WHERE city = 'London' AND ref = 'GBP')))
I think you can deal with ordering in the case like this 我认为您可以在这种情况下处理订购
SELECT TOP 1 *
FROM @Temp t
CROSS APPLY -- The ordering logic write here
(
SELECT
CASE
WHEN (city = 'London' AND ref = 'GBP') THEN 1
WHEN (city = 'London' AND ref <> 'GBP') THEN 2
-- Not match at all
END AS Value
) orders
WHERE orders.Value IS NOT NULL
ORDER BY
CASE WHEN orders.Value IS NULL THEN 1 ELSE 0 END,
orders.Value
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.