【发布时间】:2018-06-01 11:04:11
【问题描述】:
我有一个 Customer 表,其中包含针对每个客户的 4 个可能的电话号码。每个电话号码也有一个标志。
我正在尝试查询以找到以下位置的客户: 如果他们提供的所有电话号码也都设置了标志。
所以,他们需要一个或多个电话号码 NOT NULL 和 对于每个不为空的电话号码,是否有标志 = 1
我想我可以编写一个很长而且很复杂的查询来得到这个,但是有没有我遗漏的简单方法?
CREATE TABLE #Listing (id INT,
Customer VARCHAR(50),
Phone1 VARCHAR(20) NULL,
Phone1Flagged BIT,
Phone2 VARCHAR(20) NULL,
Phone2Flagged BIT,
Phone3 VARCHAR(20) NULL,
Phone3Flagged BIT,
Phone4 VARCHAR(20) NULL,
Phone4Flagged BIT)
INSERT INTO #Listing VALUES(1, 'Dave', NULL, 0, NULL, 0, NULL, 0, NULL, 0)
INSERT INTO #Listing VALUES(2, 'Fred', '0712345678', 0, NULL, 0, NULL, 0, NULL, 0)
INSERT INTO #Listing VALUES(3, 'Bob', '0712121212', 1, '0123121212', 0, NULL, 0, NULL, 0)
INSERT INTO #Listing VALUES(4, 'Bill', NULL, 0, NULL, 0, '0799999999', 1, NULL, 0)
INSERT INTO #Listing VALUES(5, 'Bert', NULL, 0, NULL, 0, '0799999977', 0, '0799999988', 1)
INSERT INTO #Listing VALUES(6, 'Andy', '01212121212', 1, '0121212122', 1, '0799999977', 1, '0799999988', 1)
并查询:
SELECT * FROM #Listing
SELECT
*
FROM
#Listing
WHERE
(
Phone1 IS NULL
OR
(
Phone1 IS NOT NULL
AND Phone1Flagged = 1
)
)
AND
(
Phone2 IS NULL
OR
(
Phone2 IS NOT NULL
AND Phone2Flagged = 1
)
)
--etc. etc. etc.
DROP TABLE #Listing
“希望”的结果
id Customer Phone1 Phone1Flagged Phone2 Phone2Flagged Phone3 Phone3Flagged Phone4 Phone4Flagged
4 Bill False False 0799999999 True False
6 Andy 01212121212 True 0121212122 True 0799999977 True 0799999988 True
【问题讨论】:
-
您使用的是哪个数据库? SQL 服务器?甲骨文?
-
样本数据和期望的结果会有所帮助。
-
@TimBiegeleisen - SQL Server 2014(添加了标签,抱歉!)
-
@GordonLinoff 在样本数据中添加了一些样本结果
标签: sql sql-server tsql select