Поиск последнего индекса строки в SQL Server 2016

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

SQL
Скопировать код
-- 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, где счёт начинается с нуля, как обычно в программировании. Не забывайте адаптировать запрос для своей таблицы и искомого значения.

Кинга Идем в IT: пошаговый план для смены профессии

Пользовательская функция на помощь

Если базовых функций недостаточно, можно создать пользовательскую функцию (User-Defined Function – UDF).

SQL
Скопировать код
-- Нечто вроде магии 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 на искомую строку:

SQL
Скопировать код
-- Важность сжатости
SELECT dbo.LastIndexOf(your_column, 'needle') as LastIndexOf
FROM your_table

Обратите внимание, что предпочтительнее использовать NVARCHAR(MAX) вместо NTEXT для совместимости и корректной работы с пробелами.

Разделение и выборка подстрок

Необходимые части: после последнего вхождения

Если вы затерялись среди строк, функции RIGHT() и LEN помогут вам извлечь подстроку после последнего вхождения разделителя:

SQL
Скопировать код
-- Полная победа!
SELECT RIGHT(your_column, LEN(your_column) – CHARINDEX(REVERSE('delimiter'), REVERSE(your_column)))
FROM your_table

Необходимые части: до последнего вхождения

Чтобы извлечь часть строки до последнего разделителя, вам пригодится функция LEFT():

SQL
Скопировать код
-- Это именно то, что нам нужно!
SELECT LEFT(your_column, CHARINDEX(REVERSE('delimiter'), REVERSE(your_column)) – 1)
FROM your_table

Этот навык будет неоценимым при работе с URL, путями к файлам или шифрованными сообщениями.

Красота Общих Табличных Выражений (CTE)

CTE прекрасно подходят для упрощения сложных запросов и улучшения их читаемости. Они идеально совмещаются с ROW_NUMBER(), когда требуется отобрать данные в определенном порядке:

SQL
Скопировать код
-- 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 превращается в интересную задачу:

Markdown
Скопировать код
Возьмите строку: "🍎Яблоко🌳Дерево🍎Фрукт🌳"

Необходимо найти позицию последнего символа 🌳:

SQL
Скопировать код
SELECT REVERSE(SUBSTRING(REVERSE('🍎Яблоко🌳Дерево🍎Фрукт🌳'), CHARINDEX('🌳', REVERSE('🍎Яблоко🌳Дерево🍎Фрукт🌳')), 1))

Результат:

Markdown
Скопировать код
Строка: 🍎Яблоко🌳Дерево🍎Фрукт🌳
Перевёрнутая: 🌳ткурФ🍎овереД🌳околбаЯ🍎
Последнее 🌳 найдено на:     ^ (6-я позиция с конца или 19-я с начала)

Таким образом, последний 🌳 находится на 19-й позиции, если считать с 1.

Подходите к анализу LastIndexOf, как к поиску последней монетки в детской игре: все элементы перед вами, и последний становится первым, если смотреть с другой стороны стола. 🧮🔚

Полезные материалы

  1. Функции строк (Transact-SQL) – SQL Server | Microsoft Learn — Аналогия с библиотекой в Хогвартсе для функций строк T-SQL, включая заклинания для поиска индекса.
  2. Как получить последний индекс строки с использованием T-SQL? – Stack Overflow — Откройте общественные обсуждения, где обсуждается задача поиска функции, аналогичной LastIndexOf, в SQL Server.
  3. REVERSE (Transact-SQL) – SQL Server | Microsoft Learn — Официальный путеводитель по функции REVERSE, ключевой при реализации логики LastIndexOf в SQL.