Поиск последнего индекса строки в SQL Server 2016
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
-- SQL-версия "поиска сокровищ"
SELECT LEN(your_column) – CHARINDEX(REVERSE('needle'), REVERSE(your_column)) as LastIndexOf
FROM your_haystack
В SQL Server, чтобы имитировать LastIndexOf
, вы можете использовать функции REVERSE
и CHARINDEX
. Данный SQL-запрос вернет позицию последнего вхождения строки needle
в your_column
, где счёт начинается с нуля, как обычно в программировании. Не забывайте адаптировать запрос для своей таблицы и искомого значения.
Пользовательская функция на помощь
Если базовых функций недостаточно, можно создать пользовательскую функцию (User-Defined Function – UDF).
-- Нечто вроде магии SQL
CREATE FUNCTION dbo.LastIndexOf(@haystack NVARCHAR(MAX), @needle NVARCHAR(MAX))
RETURNS INT AS
BEGIN
IF @haystack IS NULL OR @needle IS NULL RETURN 0 -- Потому что с NULLами шутить нельзя
RETURN LEN(@haystack) – CHARINDEX(REVERSE(@needle), REVERSE(@haystack))
END
GO
Для использования функции замените your_column
на нужное значение, а needle
на искомую строку:
-- Важность сжатости
SELECT dbo.LastIndexOf(your_column, 'needle') as LastIndexOf
FROM your_table
Обратите внимание, что предпочтительнее использовать NVARCHAR(MAX)
вместо NTEXT
для совместимости и корректной работы с пробелами.
Разделение и выборка подстрок
Необходимые части: после последнего вхождения
Если вы затерялись среди строк, функции RIGHT()
и LEN
помогут вам извлечь подстроку после последнего вхождения разделителя:
-- Полная победа!
SELECT RIGHT(your_column, LEN(your_column) – CHARINDEX(REVERSE('delimiter'), REVERSE(your_column)))
FROM your_table
Необходимые части: до последнего вхождения
Чтобы извлечь часть строки до последнего разделителя, вам пригодится функция LEFT()
:
-- Это именно то, что нам нужно!
SELECT LEFT(your_column, CHARINDEX(REVERSE('delimiter'), REVERSE(your_column)) – 1)
FROM your_table
Этот навык будет неоценимым при работе с URL, путями к файлам или шифрованными сообщениями.
Красота Общих Табличных Выражений (CTE)
CTE прекрасно подходят для упрощения сложных запросов и улучшения их читаемости. Они идеально совмещаются с ROW_NUMBER()
, когда требуется отобрать данные в определенном порядке:
-- CTE как старый добрый друг
WITH SortedResults AS (
SELECT your_column,
ROW_NUMBER() OVER (ORDER BY your_column DESC) AS RN
FROM your_table
)
SELECT your_column
FROM SortedResults
WHERE RN = 1
Это схоже с сортировкой строк по убыванию, что позволяет избежать необходимости их обратного прохода.
Производительность: приоритет у SQL-запросов
Производительность в мире SQL стоит на первом месте. Стройте свои функции таким образом, чтобы они работали максимально быстро даже с большими наборами данных.
Визуализация
Визуализируйте, как LastIndexOf превращается в интересную задачу:
Возьмите строку: "🍎Яблоко🌳Дерево🍎Фрукт🌳"
Необходимо найти позицию последнего символа 🌳
:
SELECT REVERSE(SUBSTRING(REVERSE('🍎Яблоко🌳Дерево🍎Фрукт🌳'), CHARINDEX('🌳', REVERSE('🍎Яблоко🌳Дерево🍎Фрукт🌳')), 1))
Результат:
Строка: 🍎Яблоко🌳Дерево🍎Фрукт🌳
Перевёрнутая: 🌳ткурФ🍎овереД🌳околбаЯ🍎
Последнее 🌳 найдено на: ^ (6-я позиция с конца или 19-я с начала)
Таким образом, последний 🌳
находится на 19-й позиции, если считать с 1.
Подходите к анализу LastIndexOf, как к поиску последней монетки в детской игре: все элементы перед вами, и последний становится первым, если смотреть с другой стороны стола. 🧮🔚
Полезные материалы
- Функции строк (Transact-SQL) – SQL Server | Microsoft Learn — Аналогия с библиотекой в Хогвартсе для функций строк T-SQL, включая заклинания для поиска индекса.
- Как получить последний индекс строки с использованием T-SQL? – Stack Overflow — Откройте общественные обсуждения, где обсуждается задача поиска функции, аналогичной LastIndexOf, в SQL Server.
- REVERSE (Transact-SQL) – SQL Server | Microsoft Learn — Официальный путеводитель по функции REVERSE, ключевой при реализации логики LastIndexOf в SQL.