如何从SQL Server中的列中获取特定字符?

时间:2018-01-26 07:30:07

标签: sql sql-server sql-server-2016

请帮助我如何在SQL Server中获取特定字符。

screenshoot

为:

enter image description here

规则:

  • 列a仅在'='
  • 之后选择6个字符
  • 列b获取“_”和“,”之间的字符
  • 列c获取'_'和','
  • 之间的字符

数据样本:

eNodeB Function Name=SMD085ML1_CIMANGLID, Local Cell ID=21, Cell Name=C_SMD085ML1_CIMANGLIDML2, eNodeB ID=160085, Cell FDD TDD indication=CELL_FDD
eNodeB Function Name=CRB325ML_KEJAKSAANCRB, Local Cell ID=31, Cell Name=CRB325ML_KEJAKSAANCRBML3, eNodeB ID=154325, Cell FDD TDD indication=CELL_FDD
eNodeB Function Name=CRB612ML_PILANGSARI, Local Cell ID=31, Cell Name=CRB612ML_PILANGSARIML3, eNodeB ID=154612, Cell FDD TDD indication=CELL_FDD

感谢您的关注

2 个答案:

答案 0 :(得分:2)

您可以使用CHARINDEX查找给定字符串中特定字符的位置 您可以使用SUBSTRING函数来获取所需长度的字符串值

请检查以下语法

declare @str varchar(100) =  'aerwagf=werweyyqasdwe3289afa'

select SUBSTRING(@str, CHARINDEX('=', @str)+1, 6)

对于两个特定字符之间的文本,您可以在下面的查询中引用以下SQL函数及其用法

declare @str varchar(100) =  'aerwagf=werweyyqasd-we3289afa'

select
    CHARINDEX('=',@str,1),
    CHARINDEX('-',@str,CHARINDEX('=',@str,1)),
    SUBSTRING(
        @str, 
        CHARINDEX('=',@str,1)+1,
        (CHARINDEX('-',@str,CHARINDEX('=',@str,1)) - CHARINDEX('=',@str,1)) - 1
    )

在@ Shnugo的消息后,我将解决方案应用于您的样本数据 查询现在如下

select
    SUBSTRING(a, CHARINDEX('=', a)+1, 6) as A, -- OK
    SUBSTRING(
        b, 
        CHARINDEX('_',b,1)+1,
        (CHARINDEX(',',b,CHARINDEX('_',b,1)) - CHARINDEX('_',b,1)) - 1
    ) as B,
    SUBSTRING(
        c, 
        CHARINDEX('_',c,1)+1,
        (CHARINDEX(',',c,CHARINDEX('_',c,1)) - CHARINDEX('_',c,1)) - 1
    ) as C
from TextTable

产生的输出是

enter image description here

答案 1 :(得分:0)

我的建议将首先在Name=拆分,然后单独处理这些部分:

DECLARE @mockupTable TABLE(YourString VARCHAR(500));
INSERT INTO @mockupTable VALUES
 ('eNodeB Function Name=SMD085ML1_CIMANGLID, Local Cell ID=21, Cell Name=C_SMD085ML1_CIMANGLIDML2, eNodeB ID=160085, Cell FDD TDD indication=CELL_FDD')
,('eNodeB Function Name=CRB325ML_KEJAKSAANCRB, Local Cell ID=31, Cell Name=CRB325ML_KEJAKSAANCRBML3, eNodeB ID=154325, Cell FDD TDD indication=CELL_FDD')
,('eNodeB Function Name=CRB612ML_PILANGSARI, Local Cell ID=31, Cell Name=CRB612ML_PILANGSARIML3, eNodeB ID=154612, Cell FDD TDD indication=CELL_FDD');


WITH Splitted AS
(
    SELECT CAST('<x>' + REPLACE(m.YourString,'Name=','</x><x>') + '</x>' AS XML) AS ToXml
    FROM @mockupTable AS m
)
SELECT LEFT(A.Part1,6) AS a
      ,SUBSTRING(A.Part1,Pos1_Underscore+1,Pos1_Comma-Pos1_Underscore-1) AS b
      ,SUBSTRING(A.Part2,Pos2_Underscore+1,Pos2_Comma-Pos2_Underscore-1) AS c
FROM Splitted
CROSS APPLY(SELECT ToXml.value('/x[2]','nvarchar(max)') AS Part1
                  ,ToXml.value('/x[3]','nvarchar(max)') AS Part2) AS A 
CROSS APPLY(SELECT CHARINDEX('_',A.Part1,6) AS Pos1_Underscore
                  ,CHARINDEX('_',A.Part2,6) AS Pos2_Underscore
                  ,CHARINDEX(',',A.Part1) AS Pos1_Comma
                  ,CHARINDEX(',',A.Part2) AS Pos2_Comma) AS B;

结果

a       b               c
SMD085  CIMANGLID       CIMANGLIDML2
CRB325  KEJAKSAANCRB    KEJAKSAANCRBML3
CRB612  PILANGSARI      PILANGSARIML3

使用CROSS APPLY可以创建更好的可读代码。您可以使用计算列,如命名变量...