2013-04-30 31 views
3

我有一個表SQL服務器 - 剝去非數字字符

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'); 

Table Select

Table Design

我要脫光的非數字字符並將nvarchar數字轉換爲int,然後比較哪裏他們是=

+2

請訪問http://blog.sqla uthority.com/2007/05/13/sql-server-udf-function-to-parse-alphanumeric-characters-from-string/ – mellamokb 2013-04-30 21:21:30

+0

B總是非數字後跟數字?從來沒有'X10Y'?你的第9項應該是9或-9? – 2013-04-30 22:19:37

回答

1
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

2

你沒有確切指定應返回的行,但我認爲這你想要做什麼!

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

as spezified!=我相信他希望看到3,5 6,9 9,-9 – bummi 2013-04-30 22:19:01

1

下面是一個recursive CTE版本的Pinal Dave's UDF,雖然我們正在剝什麼,但數字:

;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 
*/