2

我有一个名为的字符串Dats,它是一般外观xxxx-nnnnn(其中x是字符,n是数字)或nnn-nnnnnn.

我只想返回数字。

为此,我尝试过:

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每行都有两个功能似乎相当无效,有没有办法避免这种情况?(这将在一个大数据库上使用,该查询的结果将用作键)。

编辑:更新为新数据库有时包含额外-的 's 或.-.

DECLARE @T as table
(
    dats nvarchar(10)
)

INSERT INTO @T VALUES
('111BWA30'),
('115-200-11')
('115-22.4-1')
('10.000.22')
('600F-FFF200')
4

2 回答 2

4

我不确定你是否也想要-char 之前的数字,但如果你想要,这里有一种方法:

创建和填充示例表(在您以后的问题中保存我们这一步)

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
于 2017-02-14T09:25:59.583 回答
1

如果您知道需要删除哪些字符,请使用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
于 2017-02-14T10:00:15.213 回答