【问题标题】:Issue with patindex and unicode character '-'patindex 和 unicode 字符“-”的问题
【发布时间】:2017-07-02 11:59:00
【问题描述】:

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

编辑:更新为新数据库,有时包含额外的-. 以及-

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

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

【问题讨论】:

  • 您发布的查询语法不正确。

标签: sql-server unicode patindex


【解决方案1】:

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

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

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

【讨论】:

  • 我想从字符串中删除任何字符和- 值,因此只剩下整数。我看到这个函数就是这样做的。但是,我想问一下,因为效果很好,所以我在另一个具有相同外观的数据库上对其进行了测试,但是我现在看到它有时包含多个 -,或者有时包含 . 以及 @987654331 @。有没有什么巧妙的方法来调整这个?将很快使用示例表更新 OP。
  • 你是对的。修改太大了,不能作为编辑。接受您的回答,并且在我考虑了更多时间之后,可能会考虑使用我的“编辑”作为稍后的问题。再次感谢您提供精彩、清晰和深思熟虑的答案。
【解决方案2】:

如果您知道需要删除哪些字符,请使用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

【讨论】:

    猜你喜欢
    • 2011-10-11
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    相关资源
    最近更新 更多