【问题标题】:I want to remove the value after *.*, but it the value of the length is not definite我想删除 *.* 之后的值,但它的长度值不确定
【发布时间】:2016-11-28 11:42:29
【问题描述】:

提前谢谢你。

我想删除 之后的值。,但是长度没有定义它一直在变化,但它不应该在第二个 FULL STOP 之后取值。

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,但随着长度不断变化,我无法做到。

【问题讨论】:

  • 为什么在第二个示例中删除了-000?没有句号。该值是否可以只有 1 个或更少的句号?
  • @Jodrell:第二个例子是我必须修剪的另一个值。它有连字符而不是句号
  • 我猜到了,但这和问题有关系吗?
  • @Looking_for_answers 这很明显。但规则是什么?保留三个部分?
  • @Looking_for_answers 请检查我的更新...

标签: sql tsql


【解决方案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');

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

【讨论】:

    【解决方案2】:

    SHnugo 的解决方案非常好,但如果字符串中只有一个点 (.),则会失败。这是一个经过调整的版本,可以处理这个问题(注意我的 cmets)。

    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;
    

    【讨论】:

    • @艾伦:非常感谢。你能帮我举两个例子吗?
    【解决方案3】:

    你可以尝试如下:

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

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 2015-05-30
      • 2020-10-08
      • 2013-10-16
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      相关资源
      最近更新 更多