确定子字符串是否为数字



使用SQL server 2008,我在列' column '中有如下数据:

stringA (12345)

stringB (83859)

stringC (47326)

StringD(多余的)

我使用以下SQL返回括号中的信息:

select rm.column
    , charindex('(', rm.column)
    , charindex(')', rm.column)
    , SUBSTRING(rm.column, charindex('(', rm.column) + 1, charindex(')', rm.column) - charindex('(', rm.column))-1 
from tableRemove rm
where remover = charindex('(', rm.column) > 0

我只想要括号中包含的信息是数字的数据,如12345,83859,47326,而不是'不需要的'。

我不能使用'ISNUMERIC',因为它将始终返回false(子字符串用于获取括号中的信息)。

我不能使用'CAST',因为这会在字符串数据类型上返回错误。

是否有一种方法来确定字符串类型是否为数字/可以转换为数字?

试试下面的脚本

DECLARE @Table TABLE(
        col VARCHAR(50)
)
INSERT INTO @Table SELECT 'stringA (12345)' 
INSERT INTO @Table SELECT 'stringB (83859)' 
INSERT INTO @Table SELECT 'stringC (47326)' 
INSERT INTO @Table SELECT 'StringD (Unwanted)' 

;with cte_1
AS
(select rm.col
    , SUBSTRING(rm.col, charindex('(', rm.col) + 1, charindex(')', rm.col)-1 - charindex('(', rm.col) )FilterdData
from @Table rm)
SELECT *
FROM cte_1
WHERE ISNUMERIC(IntValue)=1

以下是使用LIKE

的一种方法
;WITH cte 
     AS (SELECT columnname, 
                Substring(rm.columnname, Charindex('(', rm.columnname) + 1,Charindex(')', rm.columnname) - Charindex('(', rm.columnname)- 1) AS extract_data 
         FROM   (SELECT 'stringA (12345)' 
                 UNION ALL 
                 SELECT 'stringB (83859)' 
                 UNION ALL 
                 SELECT 'stringC (47326)' 
                 UNION ALL 
                 SELECT 'StringD (Unwanted)') rm (columnname)) 
SELECT columnname, 
       extract_data 
FROM   cte 
WHERE  extract_data NOT LIKE '%[^0-9]%' 

对于SQL SERVER 2012+我们可以用TRY_CASTTRY_CONVERT

SELECT columnname, 
       extract_data 
FROM   cte 
WHERE  TRY_CONVERT(bigint,extract_data) is not null

WHERE  TRY_CAST(extract_data  as bigint) is not null
 select rm.column
, charindex('(', rm.column)
, charindex(')', rm.column)
, SUBSTRING(rm.column, charindex('(', rm.column) + 1, charindex(')', rm.column) - charindex('(', rm.column))-1 from tableRemove rm  where remover = charindex('(', rm.column) > 0  AND rm.column not like '%[^0-9]%'

同时使用:

Select isnumeric(SUBSTRING(rm.column, 
              charindex('(', rm.column) + 1, 
               len(rm.column) - charindex('(', rm.column))-1)
编辑:

我刚刚运行了这个,没有错误:

Declare @s varchar(200) = 'stringA (12345)'
Select isnumeric(subString(@s, 
              charindex('(', @s) + 1, 
              len(@s) - 1 - charindex('(', @s)))

相关内容

最新更新