我想删除*。*之后的值,但它的长度值不确定

时间:2016-11-28 11:42:30

标签: sql tsql

提前谢谢。

我想删除之后的值,但是未定义长度,它会不断变化,但在第二次完全停止后不应该取值。

1)实施例:
 输入: - ROL0602.E.DCM.5264403 and COK0105.F.SKE and CLT005.02A.FCM.65721

输出:ROL0602.E and COK0105.F and CLT005.02A

2)示例: 输入:SKE-5700-00211-000

输出:SKE-5700-00211

这些是我想要帮助的两列。

我尝试使用charindex,但由于长度不断变化,我无法做到。

3 个答案:

答案 0 :(得分:4)

试试这样:

DECLARE @tbl TABLE(YourValue VARCHAR(100));
INSERT INTO @tbl VALUES
 ('ROL0602.E.DCM.5264403'),('COK0105.F.SKE'),('CLT005.02A.FCM.65721'),('SKE-5700-00211-000');

SELECT CASE WHEN CHARINDEX('.',YourValue)>0 THEN LEFT(YourValue,CHARINDEX('.',YourValue,CHARINDEX('.',YourValue,1)+1)-1)
                                            ELSE YourValue END    
FROM @tbl AS tbl

结果

ROL0602.E
COK0105.F
CLT005.02A
SKE-5700-00211-000

请为最后一个示例提供规则。不知道怎么削减这个...

此命令使用LEFT从头开始获取字符串。通过搜索点找到长度,从第一个点后的位置1开始。

更新:更通用的解决方案

以下填充首先将字符串拆分为其部分(也易于与其他分隔符一起使用)。最终会根据您自己定义的规则重新连接:

DECLARE @tbl TABLE(YourValue VARCHAR(100));
INSERT INTO @tbl VALUES
 ('ROL0602.E.DCM.5264403'),('COK0105.F.SKE'),('CLT005.02A.FCM.65721'),('SKE-5700-00211-000');

 WITH Parted AS
 (
    SELECT YourValue
          ,CAST('<x>' + REPLACE(REPLACE(tbl.YourValue,'-','.'),'.','</x><x>') + '</x>' AS XML) AS Casted
          ,CASE WHEN CHARINDEX('.',YourValue)>0 THEN '.' ELSE CASE WHEN CHARINDEX('-',YourValue)>0 THEN '-' ELSE '?' END END AS SeparatorChar
    FROM @tbl AS tbl
 )
 ,SingleParts AS
 (
     SELECT SeparatorChar
           ,YourValue
           ,ISNULL(Casted.value('/x[1]','nvarchar(max)'),'') AS Part1
           ,ISNULL(Casted.value('/x[2]','nvarchar(max)'),'') AS Part2
           ,ISNULL(Casted.value('/x[3]','nvarchar(max)'),'') AS Part3
           ,ISNULL(Casted.value('/x[4]','nvarchar(max)'),'') AS Part4
           ,ISNULL(Casted.value('/x[5]','nvarchar(max)'),'') AS Part5
     FROM Parted
)
SELECT CASE SeparatorChar 
        WHEN '.' THEN Part1 + '.' + Part2
        WHEN '-' THEN Part1 + '-' + Part2 + '-' + Part3
        ELSE YourValue
       END
FROM SingleParts

结果

ROL0602.E
COK0105.F
CLT005.02A
SKE-5700-00211

答案 1 :(得分:1)

您可以尝试如下:

SELECT  REPLACE('ROL0602.E.DCM.5264403',
                ( '.' + REVERSE(SUBSTRING(REVERSE('ROL0602.E.DCM.5264403'), 0,
                                          CHARINDEX('.',
                                                    REVERSE('ROL0602.E.DCM.5264403')))) ),
                '')

答案 2 :(得分:1)

SHnugo的解决方案非常出色,但如果字符串中只有一个点(。),则会失败。这是一个可以处理的调整版本(请注意我的评论)。

DECLARE @tbl TABLE(YourValue VARCHAR(100));
INSERT INTO @tbl VALUES
 ('ROL0602.E.DCM.5264403'),('COK0105.F.SKE'),('CLT005.02A.FCM.65721'),('CLT099.02ACFVVV721'), ('SKE-5700-00211-000');

SELECT 
  CASE 
    --If there are two or more dots(.) then return everything up to the second dot:
    WHEN LEN(YourValue) - LEN(REPLACE(YourValue,'.','')) > 1
      THEN LEFT(YourValue,CHARINDEX('.',YourValue,CHARINDEX('.',YourValue,1)+1)-1)
    ELSE YourValue -- if there are 1 or 0 dots(.) then return the entire value
  END    
FROM @tbl AS tbl;