T SQL, как изменить строку, удалив все части после последнего разделителя - PullRequest
2 голосов
/ 24 июня 2011

Я изо всех сил пытаюсь найти правильные функции в SQL Server 2008 для исправления любых следующих строк, например: \\myserver\mydir1\dir2\test.txt или \\myserver2\dir1\dir2\dir3\test.txt.

В конце результат должен выглядеть следующим образом: \\myserver\mydir1\dir2 или \\myserver2\dir1\dir2\dir3, поэтому после последнего "\" подстрока должна быть удалена.

Есть идеи, как это сделать?

Ответы [ 4 ]

3 голосов
/ 24 июня 2011
DECLARE @urls TABLE (URL varchar(2000))

INSERT @urls VALUES ('\\myserver\mydir1\dir2\test.txt')
INSERT @urls VALUES ('\\myserver2\dir1\dir2\dir3\test.txt')

SELECT
    REVERSE(SUBSTRING(REVERSE(URL), CHARINDEX('\', REVERSE(URL))+1, 8000))
FROM
    @urls

Логика:

  • \\myserver\mydir1\dir2\test.txt
  • REVERSE = txt.tset\2rid\1ridym\revresym\
  • искать первый \
  • дубльвсе после этого SUBSTRING = 2rid\1ridym\revresym\
  • REVERSE = \\myserver\mydir1\dir2

Вам не нужно знать LEN строки для SUBSTRING, поэтому просто используйте 8000

Редактировать, после комментария об использовании 8000

  1. Вы можете использовать 2147483647 в SUBSTRING, потому что он поддерживает максимальные типы
  2. Только должен быть равен или больше, чем переменная или столбец varcharдлина
  3. Как насчет затрат на вычисление LEN?
  4. Практически все URL должны вписываться в 2083 байта
  5. Это имеет значение?«Преждевременная оптимизация» и т. Д.
0 голосов
/ 24 июня 2011

Попробуйте что-то вроде этого ...

SELECT CASE SUBSTRING ( [yourField], LEN([yourField])-2, LEN([yourField])-1)
WHEN '\' THEN (SUBSTRING ( [yourField], 0, LEN([yourField])-1))
ELSE [yourField]

End
  FROM [yourTable]
GO

Надеюсь, это поможет,

Джеффри Кевин Прай

0 голосов
/ 24 июня 2011
DECLARE @s VarChar(100) = '\myserver\mydir1\dir2\test.txt';

DECLARE @length Int = LEN(@s),
        @position Int = CHARINDEX('\', REVERSE(@s));

SELECT SUBSTRING(@s, 1, @length - @position);
0 голосов
/ 24 июня 2011
DECLARE @input VARCHAR(50)
SET @input = '\\myserver\mydir1\dir2\test.txt'

SELECT SUBSTRING(@input, 1, LEN(@input) - CHARINDEX('\', REVERSE(@input)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...