提前谢谢。
我想删除。之后的值,但是未定义长度,它会不断变化,但在第二次完全停止后不应该取值。
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,但由于长度不断变化,我无法做到。
答案 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;