首次出现后删除SQL Server

时间:2017-11-09 12:08:49

标签: sql sql-server tsql

我在SCCM数据库中搜索已发布的应用程序

我得到了这个输出

163net_YoudaoDictionary_5.0_ZH_x32_CN_W10

但我希望它是

163net YoudaoDictionary 5.0 

所以我需要在_XX之后删除所有内容的方法(XX是一些字符串)

我使用PATINDEX('%_[A-Z]%',la.DisplayName)来检测_XX的出现但是如何指示LEFT函数删除所有PATINDEX结果后的所有> 1

6 个答案:

答案 0 :(得分:3)

使用此:

DECLARE @DataSoruce TABLE
(
    [value] NVARCHAR(4000)
);

INSERT INTO @DataSoruce ([value])
VALUES ('163net_YoudaoDictionary_5.0_ZH_x32_CN_W10')

SELECT REPLACE(SUBSTRING([value], 0, PATINDEX('%[_][A-Z][A-Z]%',[value] COLLATE Latin1_General_100_BIN2)), '_', ' ')
FROM @DataSoruce;

答案 1 :(得分:2)

您可以使用Substring() Patindex()函数来查找模式(即_XX)&替换为' '&然后使用'_'

进一步替换' '
DECLARE @DATA NVARCHAR(MAX)

SET @DATA = '163net_YoudaoDictionary_5.0_ZH_x32_CN_W10'

SELECT REPLACE(REPLACE(@DATA, SUBSTRING(@DATA, PATINDEX('%_ZH%', @DATA), LEN(@DATA)), ''), '_', ' ');

结果:

163net YoudaoDictionary 5.0

答案 2 :(得分:2)

试试这个:

declare @str varchar(100)
set @str = '163net_YoudaoDictionary_5.0_ZH_x32_CN_W10'
select REPLACE(LEFT(@str, PATINDEX('%[_][A-Z][^a-z]%',@str COLLATE SQL_Latin1_General_CP1_CS_AS) - 4), '_', ' ')

基本上,您需要使用此类正则表达式'%[_][A-Z][^a-z]%'来查找所需内容并将搜索到的字符串排序设置为区分大小写,例如SQL_Latin1_General_CP1_CS_AS

答案 3 :(得分:1)

如果您的字符串的格式和长度始终相同,那么您可以使用SUBSTRING()REPLACE()函数:

DECLARE @Type NVARCHAR(MAX) = N'163net_YoudaoDictionary_5.0_ZH_x32_CN_W10';

SELECT SUBSTRING(REPLACE (@Type, '_', ' '), 0, 28) AS Result;

使用 REPLACE() _替换为空格' '

使用 SUBSTRING() 从字符串中剪切所需的字符串。

如果您想使用PATINDEX()

SELECT REPLACE(SUBSTRING(@Type, 0, PATINDEX('%[_][A-Z][A-Z][_]%', @Type) ), '_', ' ') AS Result;

更新

您没有提供示例数据,但这是一个示例:

CREATE TABLE MyData (
    STR NVARCHAR(MAX)
    );
INSERT INTO MYData VALUES
(N'163net_YoudaoDictionary_5.0_ZH_x32_CN_W10'),
(N'164net_YoudaoDictionary_4.0_HZ_x86_CN_W10_UD78_KIU7'),
(N'165net_YoudaoDictionary_4.1_ZH_x32'),
(N'166net_YoudaoDictionary_3.0_LF_x32_KO_X16'),
(N'167net_YoudaoDictionary_1.0_EX_x86_RW_B28');

SELECT REPLACE(SUBSTRING(STR, 0, PATINDEX('%[_][A-Z][A-Z][_]%', STR) ), '_', ' ') AS Result
FROM MyData;

结果:

+-----------------------------+
|           Result            |
+-----------------------------+
| 163net YoudaoDictionary 5.0 |
| 164net YoudaoDictionary 4.0 |
| 165net YoudaoDictionary 4.1 |
| 166net YoudaoDictionary 3.0 |
| 167net YoudaoDictionary 1.0 |
+-----------------------------+

答案 4 :(得分:0)

样本表:

DECLARE @temp TABLE (
    string nvarchar(max)
)

INSERT INTO @temp VALUES
(N'163net_YoudaoDictionary_5.0_ZH_x32_CN_W10'),
(N'157org_WhateverDictionary_7.0_smth_KJ_x64_WN_W7'),
(N''),
(NULL)

脚本:

SELECT RTRIM(REPLACE(LEFT(string,PATINDEX('%[_][A-Z][A-Z][_]%',string COLLATE Latin1_General_100_BIN2)),'_',' '))
FROM @temp

输出:

(No column name)
163net YoudaoDictionary 5.0
157org WhateverDictionary 7.0 smth

NULL

说明:

我想你知道什么代表RTRIMREPLACELEFTPATINDEXCOLLATE Latin1_General_100_BIN2二进制排序规则意味着搜索是一种直接的字节比较,显然更快。更多here 二进制排序规则部分。

答案 5 :(得分:0)

好的,我找到了一个解决方案:SCCM数据库中有视图fn_LocalizedAppProperties(1033),列标题需要通过CI_ID将其与fn_ListLatestApplicationCIs(1033)连接起来

感谢大家的建议!!