Извлечение из текста с помощью TSQL - PullRequest
0 голосов
/ 25 февраля 2012

У меня есть следующий формат строки в столбце таблицы Sql

[CID]: 267 [MID]: 319A [Name]: RJR

Как мне извлечь только значение MID, равное 319A в запросе выбора, чтобы я мог использовать MID в соединении. Другими словами, мне нужно извлечь значение MID из этого текстового поля, чтобы использовать его в соединении. Я скопировал / вставил значение, и похоже, что после каждого значения есть символы / n (новая строка).

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 25 февраля 2012

вы можете попробовать это.

declare 

    @t varchar(100)
    set @t = '[CID]: 267 [MID]: 319A [Name]: RJR';
    select ltrim(rtrim(substring(@t,charindex('[MID]:',@t)+6,(charindex('[NAME]',@t))-(charindex('[MID]:',@t)+6))))
---------------------------------------------------------
319A

ltrim и rtrim обрежет ваше значение 319A.Вы можете попробовать без них при запуске, если хотите.


Приветствия

1 голос
/ 25 февраля 2012

Не думаю, что вам нужны все эти функции обрезки и подстроки.

USE tempdb;
GO

CREATE TABLE #t1
(
    a INT,
    b VARCHAR(64)
);
INSERT #t1 SELECT 1, '[CID]: 267 [MID]: 319A [Name]: RJR'
UNION ALL  SELECT 2, '[CID]: 26232 [MID]: 229dd5A [Name]: RJ'
UNION ALL  SELECT 3, 'Garbage that will not match';

CREATE TABLE #t2
(
    c INT,
    d VARCHAR(32)
);
INSERT #t2 SELECT 4, '319A'
UNION ALL  SELECT 5, '229dd5A'
UNION ALL  SELECT 6, 'NO MATCH';

SELECT t1.a, t1.b, t2.c, t2.d
  FROM #t1 AS t1 
  INNER JOIN #t2 AS t2
  ON t1.b LIKE '%`[MID`]: ' + t2.d + ' %' ESCAPE '`'

GO
DROP TABLE #t1, #t2;

Если вы не знаете, сколько пробелов может быть между [MID]: и началом вашего значения, или концом вашего значения и началом следующего [, и при условии, что в значениях, которые вы используете, пробелов нет хотите соответствовать, вы можете использовать:

  ON REPLACE(t1.b, ' ', '') LIKE '%`[MID`]:' + t2.d + '`[%' ESCAPE '`'
1 голос
/ 25 февраля 2012

Нечисто на ВСЕХ, но если вам это нужно в SQL, вы можете использовать:

Используйте

SUBSTRING ( value_expression , start_expression , length_expression )

и

 LOCATE( string1, string2 [, start] ) 

вместе:

SUBSTRING(INPUT, 
         ((SELECT LOCATE( 'MID]: ', INPUT ))+6),
         ((SELECT LOCATE( '[Name]', INPUT )) - ((SELECT LOCATE( 'MID]: ', INPUT ))+6))

в зависимости от того, где происходит?Если это пакетный процесс, я бы экспортировал эти поля с идентификатором, написал бы perl one liner, который извлекает их, а затем загрузил их обратно в базу данных.это было бы намного быстрее, чем использование этих функций.

если это событие экрана, тогда я предлагаю разбить их на 3 столбца, это фактически сэкономит ваше пространство.

1 голос
/ 25 февраля 2012

http://www.simple -talk.com / SQL / TSQL-программирование / TSQL-регулярное выражение-верстак /

для добавления поддержки регулярных выражений на сервер sql

Rubular Regex , чтобы начать:

\[MID\]: (.*) \[Name]:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...