SQL-条件Where语句

SQL-条件Where语句,sql,sql-server,where,Sql,Sql Server,Where,我有以下表格和数据: 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 =

我有以下表格和数据:

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'))
我想做的是首先检查where city='London'和ref='GBP',如果没有行限定此项,然后检查city是否为London,ref是否可以是任何内容,尝试使用case when,但不完全有效

在这种情况下,我应该只得到第1行

谢谢

或者

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')
或者

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')

如果没有GPB行,只需使用not EXISTS返回不包含GBP的行:

看见
如果没有GPB行,只需使用not EXISTS返回不包含GBP的行:

看见
如果您处理的是单个记录,那么下一步应该可以:

SELECT  TOP 1 *
FROM    @Temp
WHERE city = 'London'
ORDER BY CASE WHEN ref = 'GBP' THEN 0 ELSE 1 END

如果您处理的是单个记录,那么下一步应该可以:

SELECT  TOP 1 *
FROM    @Temp
WHERE city = 'London'
ORDER BY CASE WHEN ref = 'GBP' THEN 0 ELSE 1 END
联合后选择是有条件的,其中

联合后选择是有条件的,其中。

您可以在以下情况下使用CASE:

您可以在以下情况下使用用例:

您可以尝试使用不存在的内容,例如:

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')))
您可以尝试使用不存在的内容,例如:

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')))

我想在这种情况下你可以处理订购事宜

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

我想在这种情况下你可以处理订购事宜

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

您的第二个解决方案不起作用:按id排序不能保证GBP在本例中是第一行是的,但肯定不是每次都是这样。与ref相同,如果存在其他货币,例如,美元?您的第二个解决方案不起作用:按id排序不能保证英镑在本例中是第一行是的,但肯定不是每次都是这样。与ref相同,如果存在其他货币,例如美元,该怎么办?默认情况下,TOP 1不返回领带。OP问题描述不是很清楚,我假设他总是只想返回单行。默认情况下,TOP 1不返回ties。OP问题描述不是很清楚,我假设他总是只想返回单行。
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