为 SQL 查询创建一个 if 语句
Create an if statement in for a SQL query
我想要一个类似于以下相同示例的视图,其中数据是从 3 个不同的表中提取的
我想创建一个查询,它将 select 每个 company
及其 location
、rooms
和 adddress
,但是如果 company
在 CA
中有一个位置我不想 select 在 NY
或 OR
中的任何其他位置。我看到 CASE
但我不确定在这种情况下如何使用它,因为我不想输入名称。现在我的查询是这样的
SELECT DISTINCT TOP (100) PERCENT
DBO.HOTEL.COMPANY, DBO.HOTEL.LOCATION AS LOCATION, DBO.AMOUNT.ROOMS,
DBO.PERSON.OWNERS, DBO.PERSON.ADDRESS
FROM DBO.HOTEL INNER JOIN DBO.HOTEL.ID = DBO.AMOUNT.HOTEL_ID INNER JOIN
DBO.HOTEL.ID = DBO.PERSON.HOTEL_ID
WHERE (LOCATION = 'OR' OR LOCATION = 'CA' OR LOCATION = 'NY') AND
DBO.HOTEL.OPEN_DATE >= 01/01/2015
您可以在此上下文中使用 NOT EXISTS:
SELECT DISTINCT TOP (100) PERCENT
DBO.HOTEL.COMPANY,
DBO.HOTEL.LOCATION AS LOCATION,
DBO.AMOUNT.ROOMS,
DBO.PERSON.OWNERS,
DBO.PERSON.ADDRESS
FROM
DBO.HOTEL INNER JOIN DBO.HOTEL.ID = DBO.AMOUNT.HOTEL_ID
INNER JOIN DBO.HOTEL.ID = DBO.PERSON.HOTEL_ID
WHERE
LOCATION = 'CA' OR (
(LOCATION = 'OR' OR LOCATION = 'NY')
AND
NOT EXISTS (
SELECT * FROM DBO.HOTEL h
WHERE h.id=DBO.HOTEL.ID AND LOCATION='CA'
)
)
AND DBO.HOTEL.OPEN_DATE >= '01/01/2015'
根据你的问题我了解到你想要select每个公司的位置、房间和地址。如果一家公司在加州,您只需要将其列出即可。
你可以尝试这样的事情(这里的例子 http://sqlfiddle.com/#!3/f9897/1):
create table hotel (
company char(2),
location char(2),
rooms int,
owners char(3),
address varchar(20)
);
insert into hotel values
('C1', 'NY', 32, 'BAP', '123 Appl'),
('C1', 'CA', 21, 'BAP', '123 Appl'),
('C1', 'OR', 24, 'BAP', '123 Appl'),
('C2', 'OR', 54, 'RED', '123 Appl'),
('C3', 'CA', 35, 'EDR', '123 Appl'),
('C4', 'NY', 14, 'LPD', '123 Appl'),
('C5', 'NY', 48, 'LPD', '123 Appl'),
('C6', 'CA', 98, 'WES', '123 Appl'),
('C6', 'OR', 56, 'WES', '123 Appl'),
('C7', 'OR', 61, 'YTR', '123 Appl'),
('C8', 'OR', 12, 'YTR', '123 Appl'),
('C9', 'CA', 25, 'MAD', '123 Appl'),
('C9', 'NY', 65, 'MAD', '123 Appl'),
('C9', 'OR', 38, 'MAD', '123 Appl');
select * from hotel
where location = 'CA'
union all
select * from hotel
where company not in (select company from hotel where location = 'CA');
Result
company location rooms owners address
C1 CA 21 BAP 123 Appl
C2 OR 54 RED 123 Appl
C3 CA 35 EDR 123 Appl
C4 NY 14 LPD 123 Appl
C5 NY 48 LPD 123 Appl
C6 CA 98 WES 123 Appl
C7 OR 61 YTR 123 Appl
C8 OR 12 YTR 123 Appl
C9 CA 25 MAD 123 Appl
我想要一个类似于以下相同示例的视图,其中数据是从 3 个不同的表中提取的
我想创建一个查询,它将 select 每个 company
及其 location
、rooms
和 adddress
,但是如果 company
在 CA
中有一个位置我不想 select 在 NY
或 OR
中的任何其他位置。我看到 CASE
但我不确定在这种情况下如何使用它,因为我不想输入名称。现在我的查询是这样的
SELECT DISTINCT TOP (100) PERCENT
DBO.HOTEL.COMPANY, DBO.HOTEL.LOCATION AS LOCATION, DBO.AMOUNT.ROOMS,
DBO.PERSON.OWNERS, DBO.PERSON.ADDRESS
FROM DBO.HOTEL INNER JOIN DBO.HOTEL.ID = DBO.AMOUNT.HOTEL_ID INNER JOIN
DBO.HOTEL.ID = DBO.PERSON.HOTEL_ID
WHERE (LOCATION = 'OR' OR LOCATION = 'CA' OR LOCATION = 'NY') AND
DBO.HOTEL.OPEN_DATE >= 01/01/2015
您可以在此上下文中使用 NOT EXISTS:
SELECT DISTINCT TOP (100) PERCENT
DBO.HOTEL.COMPANY,
DBO.HOTEL.LOCATION AS LOCATION,
DBO.AMOUNT.ROOMS,
DBO.PERSON.OWNERS,
DBO.PERSON.ADDRESS
FROM
DBO.HOTEL INNER JOIN DBO.HOTEL.ID = DBO.AMOUNT.HOTEL_ID
INNER JOIN DBO.HOTEL.ID = DBO.PERSON.HOTEL_ID
WHERE
LOCATION = 'CA' OR (
(LOCATION = 'OR' OR LOCATION = 'NY')
AND
NOT EXISTS (
SELECT * FROM DBO.HOTEL h
WHERE h.id=DBO.HOTEL.ID AND LOCATION='CA'
)
)
AND DBO.HOTEL.OPEN_DATE >= '01/01/2015'
根据你的问题我了解到你想要select每个公司的位置、房间和地址。如果一家公司在加州,您只需要将其列出即可。
你可以尝试这样的事情(这里的例子 http://sqlfiddle.com/#!3/f9897/1):
create table hotel (
company char(2),
location char(2),
rooms int,
owners char(3),
address varchar(20)
);
insert into hotel values
('C1', 'NY', 32, 'BAP', '123 Appl'),
('C1', 'CA', 21, 'BAP', '123 Appl'),
('C1', 'OR', 24, 'BAP', '123 Appl'),
('C2', 'OR', 54, 'RED', '123 Appl'),
('C3', 'CA', 35, 'EDR', '123 Appl'),
('C4', 'NY', 14, 'LPD', '123 Appl'),
('C5', 'NY', 48, 'LPD', '123 Appl'),
('C6', 'CA', 98, 'WES', '123 Appl'),
('C6', 'OR', 56, 'WES', '123 Appl'),
('C7', 'OR', 61, 'YTR', '123 Appl'),
('C8', 'OR', 12, 'YTR', '123 Appl'),
('C9', 'CA', 25, 'MAD', '123 Appl'),
('C9', 'NY', 65, 'MAD', '123 Appl'),
('C9', 'OR', 38, 'MAD', '123 Appl');
select * from hotel
where location = 'CA'
union all
select * from hotel
where company not in (select company from hotel where location = 'CA');
Result
company location rooms owners address
C1 CA 21 BAP 123 Appl
C2 OR 54 RED 123 Appl
C3 CA 35 EDR 123 Appl
C4 NY 14 LPD 123 Appl
C5 NY 48 LPD 123 Appl
C6 CA 98 WES 123 Appl
C7 OR 61 YTR 123 Appl
C8 OR 12 YTR 123 Appl
C9 CA 25 MAD 123 Appl