使用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'因为这将在字符串数据类型上返回错误。
有没有办法确定字符串类型是否为数字/可以转换为数字?
答案 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_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 :(得分: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]%'