Запрос, где для любых ненулевых значений также установлен флаг (бит) - PullRequest
0 голосов
/ 01 июня 2018

У меня есть таблица клиентов с 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

Результаты "Надеялись на"

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

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Описание немного расплывчато, но вы можете переписать свои условия следующим образом:

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;

DBFiddle Demo

Вывод:

┌────┬──────────┬─────────────┬───────────────┬────────────┬───────────────┬────────────┬───────────────┬────────────┬───────────────┐
│ 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          │
└────┴──────────┴─────────────┴───────────────┴────────────┴───────────────┴────────────┴───────────────┴────────────┴───────────────┘
0 голосов
/ 01 июня 2018

Ваша структура в порядке.Но вопрос немного сложен для понимания.Этот ответ основан на:

Итак, им нужен один или несколько телефонных номеров NOT NULL И для каждого номера телефона, который не является нулевым, имеет ли он флаг = 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) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...