Используя 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, так как это вернет ошибку для строковых типов данных.
Есть ли способ определить, является ли тип строки числовым / можно ли преобразовать в числовой?
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
Используйте оба:
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)))
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]%'
Вот один из способов использования 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
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.