确定子字符串是否为数字

时间:2016-09-05 13:59:42

标签: sql sql-server

使用SQL Server 2008我的列中有数据'列'如下:

  

     

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'因为这将在字符串数据类型上返回错误。

有没有办法确定字符串类型是否为数字/可以转换为数字?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

尝试使用以下脚本。

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

答案 2 :(得分:0)

同时使用:

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

答案 3 :(得分:0)

 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]%'