Удаление части строки после определенного символа (справа налево)

#sql-server

#sql-server

Вопрос:

Я хочу, чтобы это произошло: (левая сторона — это полная строка. с правой стороны после «—->» находится вывод, который я хочу получить)

 3.4.2.12 -----> 3.4.2
3.4.2.1-------? 3.4.2
  

Я получаю это:

 3.4.2.12-----> 3.4.2.  (note the '.' in the end)
3.4.2.1-----? 3.4.2 (this is good for me)
  

Я использовал это:

 select 
LEFT( column_name, len( column_name) - charindex('.',   column_name)) 
from table_name
  

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

1. Это звучит как проблема XY : у вас проблема X, и вы думаете, что Y — это решение, поэтому вы запрашиваете Y, когда что-то идет не так, а не X. Вы пытаетесь найти родительский элемент в иерархии? Вероятно, вам следует использовать hierarchyid и GetAncestor(1) в этом случае

2. @PanagiotisKanavos также может быть простой проблемой при разборе строки, например, при разборе строк с номером версии или аналогичных

Ответ №1:

Если я правильно понял вашу проблему, вы хотите этого:

 select left( column_name, len(column_name) - charindex('.', reverse(column_name)) ) from table_name
  

Доказательство с помощью жестко закодированных значений:

 select left( '3.4.2.12', len('3.4.2.12') - charindex('.', reverse('3.4.2.12'))) -- 3.4.2
select left( '3.4.2.1', len('3.4.2.1') - charindex('.', reverse('3.4.2.1'))) -- 3.4.2
  

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

1. Плюс один, опереди меня в этом.

2. @ShawnBitton Хорошо! Теперь вы можете принять мой ответ (отметьте его зеленой галочкой рядом с текстом ответа)

Ответ №2:

Если вы хотите, чтобы все, что осталось от последнего ‘.’, вы могли бы использовать этот код:

 USE TEMPDB

SELECT SUBSTRING ('3.4.2.12', 1, LEN ('3.4.2.12') - (CHARINDEX ('.', REVERSE ('3.4.2.12'))))
  

Ответ №3:

 DECLARE
    @var VARCHAR(20) = '3.4.2.12'

SELECT
    LEFT(@var, LEN(@var) - CHARINDEX('.', REVERSE(@var)))

SET @var = '3.4.2.1'

SELECT
    LEFT(@var, LEN(@var) - CHARINDEX('.', REVERSE(@var)))
  

Мы переворачиваем слово, ищем точку, затем вычитаем положение последней точки из длины.