Sql 如何从列为nvarchar的查询中仅返回数字
我有一个简单的查询,返回“column2”>0的记录 这是数据库中的数据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
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”的内容