【问题标题】:Sql Server -- Strip off non numeric charactersSql Server——去掉非数字字符
【发布时间】:2013-05-01 05:58:16
【问题描述】:

我有一张桌子

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TestAB](
    [A] [int] IDENTITY(1,1) NOT NULL,
    [B] [nvarchar](10) NULL,
 CONSTRAINT [PK_TestAB] PRIMARY KEY CLUSTERED 
(
    [A] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

类似的值

INSERT INTO [TestAB]([B]) 
    VALUES('A1');

INSERT INTO [TestAB]([B]) 
    VALUES('A2');

INSERT INTO [TestAB]([B]) 
    VALUES('A5');

INSERT INTO [TestAB]([B]) 
    VALUES('A4');

INSERT INTO [TestAB]([B]) 
    VALUES('AA5');

INSERT INTO [TestAB]([B]) 
    VALUES('A9');

INSERT INTO [TestAB]([B]) 
    VALUES('C7');

INSERT INTO [TestAB]([B]) 
    VALUES('D8');

INSERT INTO [TestAB]([B]) 
    VALUES('D-9');

INSERT INTO [TestAB]([B]) 
    VALUES('R$10');

我想去掉非数字字符并将 nvarchar 数字转换为 int,然后比较它们的位置!=

【问题讨论】:

标签: sql-server sql-server-2008 tsql


【解决方案1】:

您没有具体指定应返回哪些行,但我认为这可以满足您的要求:

select A, B
from dbo.TestAB
where cast(replace(B, replace(B, cast(A as nvarchar(10)), ''), '') as int) <> A

【讨论】:

  • 如他所说!= 我相信他希望看到 3,5 6,9 9,-9
【解决方案2】:
Select A,B,Case when A<>B then 0 else 1 end
from
(
select
A,
Cast(
Left(SubString(B, PatIndex('%[0-9.-]%', B), 100),
     PatIndex('%[^0-9.-]%', SubString(B, PatIndex('%[0-9.-]%', B), 100)+'_' )-1)
as int) as B
from TestAB
) aa 
where A<>B

SQL-Fiddle

【讨论】:

    【解决方案3】:

    这是Pinal Dave's UDFrecursive CTE 版本,尽管我们正在剥离除数字之外的任何内容:

    ;with digitsOnly as (
        select A, B, B as DigitB, patindex(N'%[^0-9]%', B) as IncorrectCharLoc
        from TestAB
        union all
        select A, B, cast(stuff(DigitB, IncorrectCharLoc, 1, N'') as nvarchar(10))
            , patindex(N'%[^0-9]%', stuff(DigitB, IncorrectCharLoc, 1, N''))
        from digitsOnly
        where IncorrectCharLoc > 0
    )
    select A, B, DigitB
    from digitsOnly
    where IncorrectCharLoc = 0 -- Get last iteration
        and cast(A as nvarchar(10)) <> DigitB -- Final compare
    order by A
    option (maxrecursion 0)
    
    /*
        A           B          DigitB
        ----------- ---------- ----------
        3           A5         5
        6           A9         9
    */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-22
      • 2021-02-01
      • 2012-01-24
      • 2012-11-29
      • 1970-01-01
      • 2012-01-24
      • 2011-05-11
      • 2011-04-28
      相关资源
      最近更新 更多