简体   繁体   English

SQL-条件Where语句

[英]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

LiveDemo

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM