Найдите недостающие значения из таблицы

Есть ли способ поиска в столбце varchar.

У меня есть таблица с именем x со строкой с именем par и данными в:

150/RXRPR1/18/0020642
150/RXRPR1/18/0020640
150/RXRPR1/18/0020639
151/RXRPR1/18/0020638
151/RXRPR1/18/0020637
151/RXRPR1/18/0020636
151/RXRPR1/18/0020634

Строка отсутствует

150/RXRPR1/18/0020641
151/RXRPR1/18/0020635

Как написать инструкцию SQL для поиска в таблице недостающих данных?

Данные относятся к типу varchar, и у меня есть разрешение на выбор только в базе данных.

Какие названия столбцов?

Gordon Linoff 17.12.2018 13:10

это всего лишь одна колонка, и это образец

Artur Stolc 17.12.2018 13:12

Это не только SELECT * FROM table WHERE x = '150 / RXRPR1 / 18/0020641' ??

Lucas Anschau 17.12.2018 13:13

Вы заранее знаете, какие именно строки нужно искать? Или вы ожидаете чего-то, что волшебным образом распознает узор в рядах, а затем сообщит вам, где в узоре есть пробелы?

Peter B 17.12.2018 13:13

у меня в таблице около 100000 строк с такими данными, и я хочу выбрать то, чего не хватает, если это int, который хочет быть проблемой, но это тип varchar (40)

Artur Stolc 17.12.2018 13:21

и да, я ожидаю, что это пробелы в шаблоне

Artur Stolc 17.12.2018 13:30
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
6
478
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать классическое обнаружение пробелов в правых 7 символах в ваших числах, разделенных левыми 14 символами. Используйте функцию LEAD, чтобы найти значение следующей записи, и проверьте, есть ли разница между текущим значением и следующим значением больше 1. Это обнаружит пропуски, и вы можете вычислить начало и конец разрыва, добавив 1 к текущему. значение и вычитание единицы из следующего значения. Что-то вроде этого:

declare @t table(col varchar(50))
insert into @t(col) values
('150/RXRPR1/18/0020642'),
('150/RXRPR1/18/0020640'),
('150/RXRPR1/18/0020639'),
('151/RXRPR1/18/0020638'),
('151/RXRPR1/18/0020637'),
('151/RXRPR1/18/0020636'),
('151/RXRPR1/18/0020634')

SELECT
     gapStart = left([current], 14) + right('000000' + cast(cast(right([current], 7) as int) + 1 as varchar(10)), 7)
    ,gapEnd   = left([next], 14) + right('000000' + cast(cast(right([next], 7) as int) - 1 as varchar(10)), 7)
FROM
(
SELECT
    [current] = col
   ,[next]    = LEAD(col) OVER (partition by left(col, 14) ORDER BY col)
FROM @t
) tmp
WHERE cast(right([next], 7) as int) - cast(Right([current], 7) as int) > 1;

Почему? В этом решении размер зазора не имеет значения.

Andrey Nikolov 17.12.2018 14:26

Вы можете попробовать этот запрос:

Замените @ MINVAL, @ MAXVAL соответствующими значениями.

declare @t table([VALUE] varchar(50))
insert into @t([VALUE]) values
('150/RXRPR1/18/0020642'),
('150/RXRPR1/18/0020640'),
('150/RXRPR1/18/0020639'),
('151/RXRPR1/18/0020638'),
('151/RXRPR1/18/0020637'),
('151/RXRPR1/18/0020636'),
('151/RXRPR1/18/0020634')

DECLARE @MINVAL INT = 20634, 
        @MAXVAL INT = 20642; 

WITH cte 
     AS (SELECT @MINVAL VAL 
         UNION ALL 
         SELECT val + 1 VAL 
         FROM   cte 
         WHERE  val < @MAXVAL) 
SELECT missing 
FROM   (SELECT *, 
               Replace (Lead([VALUE]) OVER ( ORDER BY val)
               , CONVERT (INT, RIGHT (Lead([VALUE]) OVER (ORDER BY val), 7)), 
               val) 
               MISSING 
        FROM   cte 
               LEFT JOIN @t X 
                      ON CONVERT (INT, RIGHT (X.[VALUE], 7)) = cte.val) X 
WHERE  [VALUE] IS NULL OPTION ( MAXRECURSION  10000)

Другие вопросы по теме