Sql 任何非空值也设置了标志(位)的查询
我有一个客户表,每个客户有4个可能的电话号码。每个电话号码也有一个标志 我正在尝试查询以查找以下客户: 如果他们提供的所有电话号码也设置了标志 因此,他们需要一个或多个不为空的电话号码 及 对于每个非空的电话号码,是否有标志=1 我想我可以写一个很长很复杂的查询来得到这个结果,但是有没有一个简单的方法我没有呢Sql 任何非空值也设置了标志(位)的查询,sql,sql-server,tsql,select,Sql,Sql Server,Tsql,Select,我有一个客户表,每个客户有4个可能的电话号码。每个电话号码也有一个标志 我正在尝试查询以查找以下客户: 如果他们提供的所有电话号码也设置了标志 因此,他们需要一个或多个不为空的电话号码 及 对于每个非空的电话号码,是否有标志=1 我想我可以写一个很长很复杂的查询来得到这个结果,但是有没有一个简单的方法我没有呢 CREATE TABLE #Listing (id INT, Customer VARCHAR(50), Phone1 VARCHAR(20) NULL, Phone1Flagged BI
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
“希望”的结果
你的结构很好。但这个问题有点难以理解。这个答案基于: 因此,他们需要一个或多个不为空的电话号码,对于每个不为空的电话号码,其标志是否为1 为此,逻辑是:
SELECT l.*
FROM #Listing l
WHERE (Phone1 IS NOT NULL AND Phone1Flagged = 1) OR
(Phone2 IS NOT NULL AND Phone2Flagged = 1) OR
(Phone3 IS NOT NULL AND Phone3Flagged = 1) OR
(Phone4 IS NOT NULL AND Phone4Flagged = 1) ;
描述有点模糊,但您可以将条件改写为:
SELECT l.*
FROM #Listing l
CROSS APPLY (SELECT MIN(CASE WHEN (p IS NOT NULL AND f = 1)
OR p IS NULL THEN 1 ELSE 0 END) r, COUNT(p) AS c
FROM (VALUES(Phone1, Phone1Flagged),
(Phone2, Phone2Flagged),
(Phone3, Phone3Flagged),
(Phone4, Phone4Flagged)) s(p,f)
) sub
WHERE r= 1 AND c > 0;
输出:
┌────┬──────────┬─────────────┬───────────────┬────────────┬───────────────┬────────────┬───────────────┬────────────┬───────────────┐
│ id │ Customer │ Phone1 │ Phone1Flagged │ Phone2 │ Phone2Flagged │ Phone3 │ Phone3Flagged │ Phone4 │ Phone4Flagged │
├────┼──────────┼─────────────┼───────────────┼────────────┼───────────────┼────────────┼───────────────┼────────────┼───────────────┤
│ 4 │ Bill │ null │ False │ null │ False │ 0799999999 │ True │ null │ False │
│ 6 │ Andy │ 01212121212 │ True │ 0121212122 │ True │ 0799999977 │ True │ 0799999988 │ True │
└────┴──────────┴─────────────┴───────────────┴────────────┴───────────────┴────────────┴───────────────┴────────────┴───────────────┘
您正在使用哪个数据库?SQL Server?Oracle?样本数据和期望的结果会有所帮助。@TimBiegeleisen-SQL Server 2014(添加了一个标记,对不起!)@GordonLinoff在样本数据中添加了一些样本结果这是一个)太棒了!但是b)返回1-Dave,他没有设置电话号码。@BlueChippy这与您最初的查询完全相同。我将添加条件来处理这个问题。谢谢@lad2025。。这就是问题所在,我只能让我的查询处理大量嵌套语句。@BlueChippy请检查修改后的版本。现在它并不等同于原始查询,而是按照您在comment中所述处理所有空值。@BlueChippy它很容易理解。使用
值
我取消激活您的表,然后使用MIN
操作交换多个和
,加上我使用了条件聚合来处理您的需求<代码>计数用于排除所有空值场景:)至少有一个电话号码的所有客户。。。他们所有的电话号码都会被标记。
┌────┬──────────┬─────────────┬───────────────┬────────────┬───────────────┬────────────┬───────────────┬────────────┬───────────────┐
│ id │ Customer │ Phone1 │ Phone1Flagged │ Phone2 │ Phone2Flagged │ Phone3 │ Phone3Flagged │ Phone4 │ Phone4Flagged │
├────┼──────────┼─────────────┼───────────────┼────────────┼───────────────┼────────────┼───────────────┼────────────┼───────────────┤
│ 4 │ Bill │ null │ False │ null │ False │ 0799999999 │ True │ null │ False │
│ 6 │ Andy │ 01212121212 │ True │ 0121212122 │ True │ 0799999977 │ True │ 0799999988 │ True │
└────┴──────────┴─────────────┴───────────────┴────────────┴───────────────┴────────────┴───────────────┴────────────┴───────────────┘