Скрыть строку на основе условия в WHERE

#sql #sql-server

#sql #sql-сервер

Вопрос:

Мой заголовок может сбить с толку, поэтому я постараюсь объяснить как можно лучше.

У меня есть две таблицы

СЛЕВА: таблица numbers СПРАВА: таблица contracts :

Я хочу показать, что для каждого экземпляра, где есть number связанный с контрактом, и он запускается с 9 , чтобы иметь свою собственную строку, изменяя значение accessID на это число. И если номер начинается с 2 него, это не изменяет accessID значение, а добавляет его в столбец phone .

Мой код

 SELECT CASE WHEN n.number LIKE '9%' THEN n.number ELSE c.accessID END accessID
        , c.client client
        , '' stat
        , '' phone
    FROM numbers n
    JOIN contracts c ON c.contractID = n.contractID
    WHERE n.number LIKE '9%'
UNION
SELECT c.accessID accessID
        , c.client client
        , c.stat stat
        , CASE WHEN n.number LIKE '2%' THEN n.number ELSE '' END phone
    FROM contracts c
    LEFT JOIN numbers n ON n.contractID = c.contractID
ORDER BY client
 

В этом случае я хочу скрыть выделенную строку, но если я добавлю WHERE n.number LIKE '2%' после LEFT JOIN , это скроет каждую строку, где accessID не начинается с 9 и не имеет никакого значения phone .

Я тоже пробовал это, но безуспешно

 WHERE EXISTS (SELECT n.number FROM numbers n where n.number like '2%')
 

Комментарии:

1. Зачем вам нужно Leon дважды, если вы не хотите Mary три раза?

2. Leon имеет номер, начинающийся с 9 , поэтому он будет отображаться дважды, обратите внимание, что в accessID столбце значения разные, для Leon , но с Mary , есть две строки с одинаковым значением.

3. Я всегда хочу показывать по одной строке для каждого, только если у них есть число, начинающееся с 9 , я хочу показать другую строку.

4. Пожалуйста, опубликуйте образцы данных в формате DDL amp; DML или форматированного текста, чтобы люди могли скопировать / вставить их для тестирования и получить ответ. Изображения не помогут другим помочь вам.

5. Вы можете использовать эту ссылку на dbfiddle с запросом и настроенными таблицами

Ответ №1:

Это вам нужно?

 SELECT CASE WHEN n.number LIKE '9%' THEN n.number ELSE c.accessID END accessID, c.client client, '' stat, '' phone
    FROM numbers n
    JOIN contracts c ON c.contractID = n.contractID
    WHERE n.number LIKE '9%'
UNION
SELECT l.accessID,l.client,l.stat,l.phone FROM (
SELECT c.accessID accessID, c.client client, c.stat stat, CASE WHEN n.number LIKE '2%' THEN n.number ELSE '' END phone
,ROW_NUMBER()OVER(PARTITION BY n.contractID,c.stat ORDER BY n.number) AS LineID
FROM contracts c
LEFT JOIN numbers n ON n.contractID = c.contractID
) AS l WHERE l.LineID=1
ORDER BY client
 

Идентификатор доступа к статическому телефону клиента


134568792 Джон запланировал 246875183 141574896 Леон установлен 0 967664616 Леон 0 139874521 Мэри отменена 225496825 914568598 Мэри 0 140410591 Тони установлен 0 918264829 Тони 0