Есть ли способ поиска в столбце 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
, и у меня есть разрешение на выбор только в базе данных.
это всего лишь одна колонка, и это образец
Это не только SELECT * FROM table WHERE x = '150 / RXRPR1 / 18/0020641' ??
Вы заранее знаете, какие именно строки нужно искать? Или вы ожидаете чего-то, что волшебным образом распознает узор в рядах, а затем сообщит вам, где в узоре есть пробелы?
у меня в таблице около 100000 строк с такими данными, и я хочу выбрать то, чего не хватает, если это int, который хочет быть проблемой, но это тип varchar (40)
и да, я ожидаю, что это пробелы в шаблоне
Вы можете использовать классическое обнаружение пробелов в правых 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;
Почему? В этом решении размер зазора не имеет значения.
Вы можете попробовать этот запрос:
Замените @ 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)
Какие названия столбцов?