Используя SQL Server 2008, у меня есть данные в столбце «Столбец», как показано ниже:

Столбец

строкаA (12345)

строкаB (83859)

строкаC (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, так как это вернет ошибку для строковых типов данных.

Есть ли способ определить, является ли тип строки числовым / можно ли преобразовать в числовой?

0
Preston 5 Сен 2016 в 16:59

4 ответа

Лучший ответ

Попробуйте с помощью сценария ниже.

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
1
Unnikrishnan R 5 Сен 2016 в 14:16

Используйте оба:

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)))
0
Charles Bretana 5 Сен 2016 в 14:46
 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]%'
0
Balan 5 Сен 2016 в 14:14

Вот один из способов использования 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_CAST или TRY_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
Pரதீப் 5 Сен 2016 в 14:16