#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)))
Мы переворачиваем слово, ищем точку, затем вычитаем положение последней точки из длины.