patindex 和 unicode 字符“-”的问题
Issue with patindex and unicode character '-'
我有一个名为 Dats
的字符串,它是一般外观 xxxx-nnnnn
(其中 x
是一个字符,n
是一个数字)或 nnn-nnnnnn
。
我只想 return 数字。
为此我已经尝试过:
SELECT Distinct dats,
Left(SubString(artikelnr, PatIndex('%[0-9.-]%', artikelnr), 8000), PatIndex('%[^0-9.-]%', SubString(artikelnr, PatIndex('%[0-9.-]%', artikelnr), 8000) + 'X')-1)
FROM ThatDatabase
这几乎是我想要的。它会删除常规字符 x
,但不会删除 unicode 字符 -
。我怎样才能删除它?而且,每行有两个 PatIndex
函数似乎相当无效,有没有办法避免这种情况? (这将用于大型数据库,其中此查询的结果将用作键)。
编辑:更新为新数据库,有时包含额外的 -
或 .
以及 -
。
DECLARE @T as table
(
dats nvarchar(10)
)
INSERT INTO @T VALUES
('111BWA30'),
('115-200-11')
('115-22.4-1')
('10.000.22')
('600F-FFF200')
我不确定您是否也想要 -
字符之前的数字,但如果您想要,这里有一种方法:
创建并填充示例 table(请在您以后的问题中省去这一步)
DECLARE @T as table
(
dats nvarchar(10)
)
INSERT INTO @T VALUES
('abcde-1234'),
('23-343')
查询:
SELECT dats,
case when patindex('%[^0-9]-[0-9]%', dats) > 0 then
right(dats, len(dats) - patindex('%-[0-9]%', dats))
else
stuff(dats, charindex('-', dats), 1, '')
end As NumbersOnly
FROM @T
结果:
dats NumbersOnly
abcde-1234 1234
23-343 23343
如果您只想要 -
字符右侧的数字,则更简单:
SELECT dats,
right(dats, len(dats) - patindex('%-[0-9]%', dats)) As RightNumbersOnly
FROM @T
结果:
dats RightNumbersOnly
abcde-1234 1234
23-343 343
如果您知道需要删除哪些字符,请使用 REPLACE
函数
DECLARE @T as table
(
dats nvarchar(100)
)
INSERT INTO @T
VALUES
('111BWA30'),
('115-200-11'),
('115-22.4-1'),
('10.000.22'),
('600F-FFF200')
SELECT REPLACE(REPLACE(dats, '.', ''), '-', '')
FROM @T
我有一个名为 Dats
的字符串,它是一般外观 xxxx-nnnnn
(其中 x
是一个字符,n
是一个数字)或 nnn-nnnnnn
。
我只想 return 数字。
为此我已经尝试过:
SELECT Distinct dats,
Left(SubString(artikelnr, PatIndex('%[0-9.-]%', artikelnr), 8000), PatIndex('%[^0-9.-]%', SubString(artikelnr, PatIndex('%[0-9.-]%', artikelnr), 8000) + 'X')-1)
FROM ThatDatabase
这几乎是我想要的。它会删除常规字符 x
,但不会删除 unicode 字符 -
。我怎样才能删除它?而且,每行有两个 PatIndex
函数似乎相当无效,有没有办法避免这种情况? (这将用于大型数据库,其中此查询的结果将用作键)。
编辑:更新为新数据库,有时包含额外的 -
或 .
以及 -
。
DECLARE @T as table
(
dats nvarchar(10)
)
INSERT INTO @T VALUES
('111BWA30'),
('115-200-11')
('115-22.4-1')
('10.000.22')
('600F-FFF200')
我不确定您是否也想要 -
字符之前的数字,但如果您想要,这里有一种方法:
创建并填充示例 table(请在您以后的问题中省去这一步)
DECLARE @T as table
(
dats nvarchar(10)
)
INSERT INTO @T VALUES
('abcde-1234'),
('23-343')
查询:
SELECT dats,
case when patindex('%[^0-9]-[0-9]%', dats) > 0 then
right(dats, len(dats) - patindex('%-[0-9]%', dats))
else
stuff(dats, charindex('-', dats), 1, '')
end As NumbersOnly
FROM @T
结果:
dats NumbersOnly
abcde-1234 1234
23-343 23343
如果您只想要 -
字符右侧的数字,则更简单:
SELECT dats,
right(dats, len(dats) - patindex('%-[0-9]%', dats)) As RightNumbersOnly
FROM @T
结果:
dats RightNumbersOnly
abcde-1234 1234
23-343 343
如果您知道需要删除哪些字符,请使用 REPLACE
函数
DECLARE @T as table
(
dats nvarchar(100)
)
INSERT INTO @T
VALUES
('111BWA30'),
('115-200-11'),
('115-22.4-1'),
('10.000.22'),
('600F-FFF200')
SELECT REPLACE(REPLACE(dats, '.', ''), '-', '')
FROM @T