我想从字符串中删除部分字符串
Posted
技术标签:
【中文标题】我想从字符串中删除部分字符串【英文标题】:I want to remove part of string from a string 【发布时间】:2017-03-28 06:05:10 【问题描述】:提前谢谢你。
我想删除 . 之后的字符串,包括 .,但是长度是可变的,字符串可以是任意长度。
1) 示例:
输入:-SCC0204.X and FRK0005.X and RF0023.X and ADF1010.A and HGT9010.V
输出:SCC0204 and FRK0005 and RF0023 and ADF1010.A and HGT9010.V
我尝试使用 charindex,但随着长度不断变化,我无法做到。我想修剪仅以 X 结尾的值
任何帮助将不胜感激。
【问题讨论】:
总是只有一个点吗? 你在使用oracle吗? 是的,我只有一个点。我想只用.X
修剪值,我正在使用 mssql 2010
【参考方案1】:
假设只有一个点
UPDATE TABLE
SET column_name = left(column_name, charindex('.', column_name) - 1)
对于选择
select left(column_name, charindex('.', column_name) - 1) AS col
from your_table
【讨论】:
【参考方案2】:希望这会有所帮助。该代码仅在值具有小数点“。”时修剪字符串。如果该值等于.X
;WITH cte_TestData(Code) AS
(
SELECT 'SCC0204.X' UNION ALL
SELECT 'FRK0005.X' UNION ALL
SELECT 'RF0023.X' UNION ALL
SELECT 'ADF1010.A' UNION ALL
SELECT 'HGT9010.V' UNION ALL
SELECT 'SCC0204' UNION ALL
SELECT 'FRK0005'
)
SELECT CASE
WHEN CHARINDEX('.', Code) > 0 AND RIGHT(Code,2) = '.X'
THEN SUBSTRING(Code, 1, CHARINDEX('.', Code) - 1)
ELSE Code
END
FROM cte_TestData
如果标准只是替换删除.X
,那么这可能也应该工作
;WITH cte_TestData(Code) AS
(
SELECT 'SCC0204.X' UNION ALL
SELECT 'FRK0005.X' UNION ALL
SELECT 'RF0023.X' UNION ALL
SELECT 'ADF1010.A' UNION ALL
SELECT 'HGT9010.V' UNION ALL
SELECT 'SCC0204' UNION ALL
SELECT 'FRK0005'
)
SELECT REPLACE (Code,'.X','')
FROM cte_TestData
【讨论】:
【参考方案3】:使用左字符串函数:
DECLARE @String VARCHAR(100) = 'SCC0204.XXXXX'
SELECT LEFT(@String,CHARINDEX('.', @String) - 1)
【讨论】:
【参考方案4】:我认为你最好的选择是创建一个解析字符串并使用正则表达式的函数。我希望这篇旧帖子对您有所帮助:
Perform regex (replace) in an SQL query
但是,如果您需要修剪的值始终是“.X”,那么您应该使用 选择替换(字符串,'.x','')
【讨论】:
从您提供的链接中添加所需的代码,就好像链接中的代码将被更改一样,这可能不是有用的答案。【参考方案5】:请检查以下代码。我想这会对你有所帮助。
DECLARE @String VARCHAR(100) = 'SCC0204.X'
IF (SELECT RIGHT(@String,2)) ='.X'
SELECT LEFT(@String,CHARINDEX('.', @String) - 1)
ELSE
SELECT @String
【讨论】:
【参考方案6】:更新:我刚刚错过了 OP 阐明要求的 cmets 之一。我在下面汇总的是您将如何处理删除以 X 结尾的字符串上的第一个点之后的所有内容的要求。我将其留在这里以供参考。
;WITH cte_TestData(Code) AS
(
SELECT 'SCC0204.X' UNION ALL -- ends with '.X'
SELECT 'FRK.000.X' UNION ALL -- ends with '.X', contains multiple dots
SELECT 'RF0023.AX' UNION ALL -- ends with '.AX'
SELECT 'ADF1010.A' UNION ALL -- ends with '.A'
SELECT 'HGT9010.V' UNION ALL -- ends with '.V'
SELECT 'SCC0204.XF' UNION ALL -- ends with '.XF'
SELECT 'FRK0005' UNION ALL -- totally clean
SELECT 'ABCX' -- ends with 'X', not dots
)
SELECT
orig_string = code,
newstring =
SUBSTRING
(
code, 1,
CASE
WHEN code LIKE '%X'
THEN ISNULL(NULLIF(CHARINDEX('.',code)-1, -1), LEN(code))
ELSE LEN(code)
END
)
FROM cte_TestData;
仅供参考 - SQL Server 2012+ 您可以像这样简化此代码:
SELECT
orig_string = code,
newstring =
SUBSTRING(code, 1,IIF(code LIKE '%X', ISNULL(NULLIF(CHARINDEX('.',code)-1, -1), LEN(code)), LEN(code)))
FROM cte_TestData;
【讨论】:
【参考方案7】:使用 SUBSTRING,您可以通过以下代码实现您的要求。
SELECT SUBSTRING(column_name, 0, CHARINDEX('.', column_name)) AS col
FROM your_table
如果你想从字符串中移除固定的.X,你也可以使用REPLACE函数。
SELECT REPLACE(column_name, '.X', '') AS col
【讨论】:
以上是关于我想从字符串中删除部分字符串的主要内容,如果未能解决你的问题,请参考以下文章