、あなたはこれを行うことができます:
-- Sample Data
Declare @YourTable table (ID int,SomeString varchar(50))
Insert Into @YourTable values
(1,'<123 searchCriteria'),
(2,'123 searchCriteria'),
(3,'1.23'),
(4,'123,000 searchCriteria'),
(5,'1.23x10e8 searchCriteria'),
(6,'1,234.5 g/L'),
(7,'Not measured')
-- Solution:
SELECT yt.*, [Substring_Removed] =
ISNULL(CAST(CAST(NewString AS decimal(10,2)) AS varchar(12)), SomeString)
FROM @YourTable yt
CROSS APPLY dbo.PatExclude8K(SomeString, '[^0-9.]');
結果:できない人のために更新
ID SomeString Substring_Removed
----------- ---------------------------- -----------------
1 <123 searchCriteria 123.00
2 123 searchCriteria 123.00
3 1.23 1.23
4 123,000 searchCriteria 123000.00
5 1.23x10e8 searchCriteria 1.23
6 1,234.5 g/L 1234.50
7 Not measured Not measured
を新しい機能を使用してください...
は、ここで適切なソリューションの中で焼いpatexclude8K機能です:
-- Sample Data
Declare @YourTable table (ID int,SomeString varchar(50))
Insert Into @YourTable values
(1,'<123 searchCriteria'),
(2,'123 searchCriteria'),
(3,'1.23'),
(4,'123,000 searchCriteria'),
(5,'1.23x10e8 searchCriteria'),
(6,'1,234.5 g/L'),
(7,'Not measured')
-- new solution with Patexclude8K logic baked in
SELECT yt.*, substring_removed = ISNULL(CAST(CAST(NewString AS decimal(10,2)) AS varchar(12)), yt.SomeString)
FROM @yourTable yt
CROSS APPLY
(
SELECT SUBSTRING(yt.someString, N, 1)
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) a(x),
(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) b(x),
(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) c(x),
(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) d(x)
) iTally(N)
WHERE N <= (CONVERT(INT,LEN(yt.someString),0))
AND 0 = PATINDEX('[^0-9.]',SUBSTRING(yt.someString COLLATE Latin1_General_BIN,N,1))
FOR XML PATH('')
) patexclude(newstring);
結果は同じですが、この方法は、特別な扱いが特殊なXML文字のために必要ではないので、私はもともと投稿何よりも約40%速くなります。
サンプルデータと望ましい結果が役立ちます –
代表的なデータは、数値の後に小節の単位、または手動で入力された値が続きます。私は10進数の後に2桁で表示された測定単位のない数値を表示したいと思います。 1,234.5 g/Lは1234.50と表示されます –
ソース列に手動で入力された値の例は「測定されません」 –