我有一个字符串:
@string='TEST RESULTS\TEST 1\RESULT 1
除数字
外,字符串/文本保持不变用于查询:
SET @sql = "SELECT *
FROM TABLE
WHERE test = (expression FOR CASE 1 resulting IN INT 1)
AND result = (expression FOR CASE 2 resulting IN INT 1)"
答案 0 :(得分:6)
看起来你已经有了一个满足你需求的解决方案,但我有一个小技巧,我用来从字符串中提取我认为可能对某人有益的数字。它利用FOR XML语句并避免显式循环。它具有良好的内联表函数或简单的标量。用它来做你想做的事情:))
DECLARE @String varchar(255) = 'This1 Is2 my3 Test4 For Number5 Extr@ct10n';
SELECT
CAST((
SELECT CASE --// skips alpha. make sure comparison is done on upper case
WHEN ( ASCII(UPPER(SUBSTRING(@String, Number, 1))) BETWEEN 48 AND 57 )
THEN SUBSTRING(@String, Number, 1)
ELSE ''END
FROM
(
SELECT TOP 255 --// east way to get a list of numbers
--// change value as needed.
ROW_NUMBER() OVER ( ORDER BY ( SELECT 1 ) ) AS Number
FROM master.sys.all_columns a
CROSS JOIN master.sys.all_columns b
) AS n
WHERE Number <= LEN(@String)
--// use xml path to pivot the results to a row
FOR XML PATH('') ) AS varchar(255)) AS Result
结果==&gt; 1234510
答案 1 :(得分:3)
您可以编写可以通过搜索查询使用的sql函数的脚本。 这是示例代码。
CREATE FUNCTION udf_extractInteger(@string VARCHAR(2000))
RETURNS VARCHAR(2000)
AS
BEGIN
DECLARE @count int
DECLARE @intNumbers VARCHAR(1000)
SET @count = 0
SET @intNumbers = ''
WHILE @count <= LEN(@string)
BEGIN
IF SUBSTRING(@string, @count, 1)>='0' and SUBSTRING (@string, @count, 1) <='9'
BEGIN
SET @intNumbers = @intNumbers + SUBSTRING (@string, @count, 1)
END
SET @count = @count + 1
END
RETURN @intNumbers
END
GO
QUERY:
SELECT dbo.udf_extractInteger('hello 123 world456') As output
输出: 123456
参考:http://www.ittutorials.in/source/sql/sql-function-to-extract-only-numbers-from-string.aspx
答案 2 :(得分:1)
由于您有稳定的文字且只有2个元素,因此您可以充分利用replace和parsename:
declare @string varchar(100) = 'TEST RESULTS\TEST 1\RESULT 2'
select cast(parsename(replace(replace(@string, 'TEST RESULTS\TEST ', ''), '\RESULT ', '.'), 2) as int) as Test
, cast(parsename(replace(replace(@string, 'TEST RESULTS\TEST ', ''), '\RESULT ', '.'), 1) as int) as Result
/*
Test Result
----------- -----------
1 2
*/
替换部分总是假定相同的文本和间距,并设置具有句点的parsename。
答案 3 :(得分:0)
此方法使用SUBSTRING
,PARSENAME
和PATINDEX
:
SELECT
SUBSTRING(PARSENAME(c,2), PATINDEX('%[0-9]%',PARSENAME(c,2)), LEN(c)) Test,
SUBSTRING(PARSENAME(c,1), PATINDEX('%[0-9]%',PARSENAME(c,1)), LEN(c)) Result
FROM ( SELECT REPLACE(@val, '\', '.') c) t
使用PARSENAME
拆分字符串。字符串的文本无关紧要 - 它只需要包含2个反斜杠来解析为3个元素。将PATINDEX
与正则表达式一起使用可替换结果中的非数字值。如果数字前面的文字包含数字,则需要进行调整。
如果需要,将结果CAST / CONVERT转换为int或相应的数据类型。
以下是一些示例Fiddle。
祝你好运。