2013-03-08 145 views
0

使用SQL Server 2005/2008,我试图从列中返回只有一些字段中包含字母的数字。如何仅返回包含数字和字母的列中的数字?

SELECT 
    DISTINCT Cashregister 
FROM 
    dbo.RPTrs 
WHERE 
    TRSDate > GETDATE()-100 AND 
    StoreID = @sname 

返回

enter image description here

SELECT 
    DISTINCT Cashregister 
FROM 
    dbo.RPTrs 
WHERE 
    TRSDate > GETDATE()-100 AND 
    StoreID = @sname AND 
    Cashregister not like '%[^0-9]%' 

返回

enter image description here

w ^我需要的是从第一个查询中返回所有的寄存器,但没有X中的寄存器。

预期结果:

| Cashregister 
---------------- 
1 | 24 
2 | 44 
3 | 32 
4 | 36 
5 | 45 
6 | 21 
7 | 03 
8 | 40 
9 | 22 
10 | 23 
11 | 35 
12 | 01 
13 | 04 
14 | 34 
15 | 33 
16 | 02 
+1

是否总是以单个X和从未任何其它字符? – 2013-03-08 16:05:28

+0

是的。虽然JW给出了答案。 – JohnZ 2013-03-08 16:08:10

回答

2

使用REPLACE()

SELECT DISTINCT REPLACE(Cashregister, 'X', '') Cashregister 
FROM dbo.RPTrs 
WHERE TRSDate > GETDATE()-100 AND 
     StoreID = @sname 

注意: REPLACE()是区分大小写的。

+0

恩,请问为什么是错的呢? ':)' – 2013-03-08 16:05:18

+0

这个效果很好。谢谢 – JohnZ 2013-03-08 16:06:46

+2

那么,最初你用'ISNUMERIC'过滤了这是绝对错误的。在回答之前,别人没有完全读完这个问题。 – 2013-03-08 16:08:11

0

如果在您的SQL版本中可用,则可以使用REGEXP。你不需要像我的例子那样使用UNION。这只是为了建立数据瓦特/表...:

-- Digits only -- 
SELECT REGEXP_REPLACE('X45','[^0-9]') digits_only FROM your_tab 
    UNION 
SELECT REGEXP_SUBSTR('X40','[[:digit:]]+') AS digits_only FROM your_tab 
/

DIGITS_ONLY 
------------ 
40 
45 

另外:

SELECT REGEXP_REPLACE('12ZXC3ASD456FGH8TED63','\D') digits_only FROM some_tab 
/
SELECT REGEXP_REPLACE('12ZXC3ASD456FGH8TED63','[^[:digit:]]') digits_only FROM some_tab 
/
+0

不,在本日发布的任何SQL Server版本中都不可用。 – 2013-03-08 16:55:53

相关问题