Sql 如何从列为nvarchar的查询中仅返回数字

Sql 如何从列为nvarchar的查询中仅返回数字,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个简单的查询,返回“column2”>0的记录 这是数据库中的数据 Column1 Column2 1 123456789 2 123456781 3 13-151-1513 4 alsdjf 5 6 000000000 她就是问题所在 select column1, replace(a

我有一个简单的查询,返回“column2”>0的记录

这是数据库中的数据

Column1          Column2
1                123456789
2                123456781
3                13-151-1513
4                alsdjf
5                 
6                000000000
她就是问题所在

 select column1, replace(a.Payroll_id,'-','')
    from table1
    where isnumeric(column2) = 1
我想退回以下物品:

Column1          Column2
1                123456789
2                123456781
3                131511513
这意味着,当列为空(或null)时,我不会选择任何记录,如果不是整数,则不会返回行,并且会删除“-”,并且不会显示第6行,因为它都是0


我该怎么做呢?

我想你可以用这样的方法:

USE tempdb
GO
CREATE TABLE #Temp
(
ID INT IDENTITY
,VALUE VARCHAR(30)
)
INSERT INTO #Temp (VALUE) VALUES ('1213213'), ('1213213'), ('121-32-13'), ('ASDFASF2123')
GO
WITH CteData
AS
(
SELECT REPLACE(VALUE,'-','') as Valor FROM #Temp 
)
SELECT * FROM CteData WHERE (ISNUMERIC(Valor) = 1 AND valor not like '%[0-0]%')
DROP TABLE #Temp 

然后您可以对空、空、0等应用验证

我认为您可以使用类似的方法:

USE tempdb
GO
CREATE TABLE #Temp
(
ID INT IDENTITY
,VALUE VARCHAR(30)
)
INSERT INTO #Temp (VALUE) VALUES ('1213213'), ('1213213'), ('121-32-13'), ('ASDFASF2123')
GO
WITH CteData
AS
(
SELECT REPLACE(VALUE,'-','') as Valor FROM #Temp 
)
SELECT * FROM CteData WHERE (ISNUMERIC(Valor) = 1 AND valor not like '%[0-0]%')
DROP TABLE #Temp 

然后,您可以对空、空、0等应用验证如果您使用的是SQL2012或更高版本,您还可以使用在解析中更具选择性的
TRY\u PARSE
。如果记录无法转换,此函数将返回
NULL
。您可以这样使用它:

CREATE TABLE #temp
    (
     ID INT IDENTITY ,
     VALUE VARCHAR(30)
    )
INSERT  INTO #temp
       ( VALUE )
VALUES  ( '1213213' ),
       ( '1213213' ),
       ( '121-32-13' ),
       ( 'ASDFASF2123' ),
       ( '0000000' )

SELECT  ParsedValue
FROM   #temp
       CROSS APPLY ( SELECT TRY_PARSE(
                          Value AS INT ) AS ParsedValue
                ) details
WHERE   ParsedValue IS NOT NULL
AND ParsedValue>0

如果您使用的是SQL2012或更高版本,您还可以使用在解析中更具选择性的
TRY_PARSE
。如果记录无法转换,此函数将返回
NULL
。您可以这样使用它:

CREATE TABLE #temp
    (
     ID INT IDENTITY ,
     VALUE VARCHAR(30)
    )
INSERT  INTO #temp
       ( VALUE )
VALUES  ( '1213213' ),
       ( '1213213' ),
       ( '121-32-13' ),
       ( 'ASDFASF2123' ),
       ( '0000000' )

SELECT  ParsedValue
FROM   #temp
       CROSS APPLY ( SELECT TRY_PARSE(
                          Value AS INT ) AS ParsedValue
                ) details
WHERE   ParsedValue IS NOT NULL
AND ParsedValue>0

这里要小心。有很多非数字可以让ISNUMERIC函数相信它实际上是一个数字。添加另一个值,如“1e4”。我只是按照故事中提到的“并将删除“-”,我可以应用不同的验证来避免与特殊字符相关的场景(不难做到),接受批评,但也提供解决方案或不同的方法来做某事。这就是为什么我们都在这里分享我们的知识。de.:)你能分享你的代码或更新问题吗?在我的示例中,我使用的是CTE,因此不确定你是如何得到错误的。对不起,它与Isnumeric一起工作,但我也不想要任何“0”的东西。在这里要小心。有很多非数字可以让ISNUMERIC函数相信它实际上是一个数字。添加另一个值,如“1e4”。我只是按照故事中提到的“并将删除“-”,我可以应用不同的验证来避免与特殊字符相关的场景(不难做到),接受批评,但也提供解决方案或不同的方法来做某事。这就是为什么我们都在这里分享我们的知识。de.:)您可以分享您的代码或更新问题吗?在我的示例中,我使用的是CTE,因此不确定您是如何得到错误的。抱歉-它与Isnumeric一起工作,但我也不想要任何“0”的内容