使用tsql从文本中提取

时间:2012-02-24 21:21:01

标签: sql sql-server tsql text-extraction

我在Sql表列中有以下字符串格式

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

如何在select查询中仅提取MID的值319A,以便在连接中使用MID。 换句话说,我需要从此文本字段中提取MID值以在连接中使用它。我复制/粘贴了值,看起来每个值后都有/ n(新行)字符。

提前致谢

4 个答案:

答案 0 :(得分:2)

你可以试试这个。

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 :(得分:1)

http://www.simple-talk.com/sql/t-sql-programming/tsql-regular-expression-workbench/

向sql server添加正则表达式支持

Rubular Regex让你入门:

\[MID\]: (.*) \[Name]:

答案 2 :(得分:1)

在ALL中不干净,但如果你在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))

取决于发生的地方?如果它是在批处理过程中,我会导出带有ID的字段,写一个提取它们的perl一行,然后将它们加载回db。它会比使用这些功能快得多。

如果是屏幕事件,那么我建议将它们分成3列,这样可以节省空间。

答案 3 :(得分:1)

不要认为你需要所有这些修剪和子串函数。

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 '`'