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