Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 任何非空值也设置了标志(位)的查询_Sql_Sql Server_Tsql_Select - Fatal编程技术网

Sql 任何非空值也设置了标志(位)的查询

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

我有一个客户表,每个客户有4个可能的电话号码。每个电话号码也有一个标志

我正在尝试查询以查找以下客户: 如果他们提供的所有电话号码也设置了标志

因此,他们需要一个或多个不为空的电话号码 及 对于每个非空的电话号码,是否有标志=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
“希望”的结果


你的结构很好。但这个问题有点难以理解。这个答案基于:

因此,他们需要一个或多个不为空的电话号码,对于每个不为空的电话号码,其标志是否为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          │
└────┴──────────┴─────────────┴───────────────┴────────────┴───────────────┴────────────┴───────────────┴────────────┴───────────────┘