SQL需要有substring和charindex的建议

时间:2016-02-17 16:55:39

标签: sql sql-server tsql

我有以下字符串'Custom Code changed from (JA) to (JC)'

我想将JA提取到column,将JC提取到另一个。

我已设法使用

获得第一个括号
  SUBSTRING(Call_Note_Note, CHARINDEX('(', Call_Note_Note + '(') + 1, 
  CHARINDEX(')', Call_Note_Note + '()') - CHARINDEX('(', Call_Note_Note + '(') - 1) as 'first'

我无法弄清楚如何使用simular查询来提取第二部分?

任何帮助都会很棒!

附加 一个支架可以有两种格式,另一种支架可以有两种,见下文。

Custom Code (POO) Added
Custom Code changed from (POO) to (JA)

阿隆

2 个答案:

答案 0 :(得分:0)

假设它总是只有两个代码。

以下是使用REVERSE()功能执行此操作的方法。这将返回第一个和最后一个:

DECLARE @String VARCHAR(100) = 'Custom Code changed from (JA) to (JC)' 

SELECT SUBSTRING(@String, CHARINDEX('(', @String + '(') + 1,CHARINDEX(')', @String + '()') - CHARINDEX('(', @String + '(') - 1) as 'first',  
      REVERSE(SUBSTRING(REVERSE(@String), CHARINDEX(')', REVERSE(@String) + '(') + 1, CHARINDEX('(', REVERSE(@String) + ')(') - CHARINDEX(')', REVERSE(@String) + ')') - 1)) as 'Second'

结果:

enter image description here

答案 1 :(得分:0)

另一种方式是(更易读)

DECLARE @str VARCHAR(max)='Custom Code changed from (JA) to (JC)';

WITH cte
     AS (SELECT @str AS string)
SELECT Substring(string, fst + 1, scd - fst - 1) as first_val,
       Substring(string, trd + 1, fou - trd - 1) as second_val
FROM   cte
       CROSS apply (VALUES (Charindex('(', string))) cs (fst)
       CROSS apply (VALUES (Charindex(')', string, fst + 1))) cs1 (scd)
       CROSS apply (VALUES (Charindex('(', string, scd + 1))) cs2 (trd)
       CROSS apply (VALUES (Charindex(')', string, trd + 1))) cs3 (fou) 

<强>结果:

╔═══════════╦════════════╗
║ first_val ║ second_val ║
╠═══════════╬════════════╣
║ JA        ║ JC         ║
╚═══════════╩════════════╝