我在Sql表列中有以下字符串格式
[CID]: 267 [MID]: 319A [Name]: RJR
如何在select查询中仅提取MID的值319A,以便在连接中使用MID。 换句话说,我需要从此文本字段中提取MID值以在连接中使用它。我复制/粘贴了值,看起来每个值后都有/ n(新行)字符。
提前致谢
答案 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 '`'