Tsql 字符串搜索转换为行的输出

Tsql 字符串搜索转换为行的输出,tsql,Tsql,我将非常感谢您在以下方面的帮助。 从实际表格开始,如何实现所需表格1或所需表格2。 如何使用patindex函数识别下一次发作 问候,, 阿瑞克 有些是胡乱猜测。。。我的魔法水晶球告诉我,你可能正在寻找这样的东西: 我从一个模拟表开始模拟您的问题。 这是你应该为下一个问题自己做的事情。电视上的人不喜欢照片 DECLARE @mockup TABLE(TicketID INT,[Text] NVARCHAR(MAX)); INSERT INTO @mockup VALUES(1,'here is

我将非常感谢您在以下方面的帮助。 从实际表格开始,如何实现所需表格1或所需表格2。 如何使用patindex函数识别下一次发作

问候,, 阿瑞克


有些是胡乱猜测。。。我的魔法水晶球告诉我,你可能正在寻找这样的东西:

我从一个模拟表开始模拟您的问题。
这是你应该为下一个问题自己做的事情。电视上的人不喜欢照片

DECLARE @mockup TABLE(TicketID INT,[Text] NVARCHAR(MAX));
INSERT INTO @mockup VALUES(1,'here is no fitting pattern at all')
                         ,(2,'one fitting pattern at the end 123.234.345')
                         ,(3,'234.345.456 one fitting pattern at the beginning')
                         ,(4,'one fitting pattern 456.567.678 in the middle')
                         ,(5,'several 987.876.765 fitting 876.756.645 patterns 123.234.345');
--查询将使用XML技巧将字符串拆分为片段。
--检查每个片段是否有两个点,不带点的值必须可转换为
BIGINT

--这可能并不完美,但众所周知,SQL Server在执行此类操作时相当薄弱

SELECT t.TicketID
      ,C.Fragment
FROM @mockup t
CROSS APPLY(SELECT CAST('<x>' + REPLACE(t.[Text],' ','</x><x>') + '</x>' AS XML)) A(Casted)
CROSS APPLY A.Casted.nodes('/x') B(FragmentXml)
CROSS APPLY(SELECT B.FragmentXml.value('text()[1]','nvarchar(max)')) C(Fragment)
WHERE LEN(C.Fragment)-LEN(REPLACE(C.Fragment,'.',''))=2               --two dots
      AND TRY_CAST(REPLACE(C.Fragment,'.','') AS BIGINT) IS NOT NULL  --a number without dots

这是很简单的,如果你拿起一个副本。这里“我使用@shnugo的样本数据,但根据我的水晶球,我添加的数字不应包含在最终输出中。”

-- sample data
DECLARE @mockup TABLE(TicketID INT,[Text] NVARCHAR(MAX));
INSERT INTO @mockup VALUES(1,'here is no fitting pattern at all')
                         ,(2,'one fitting pattern 123 at the end 123.234.345')
                         ,(3,'234.345.456 one fitting pattern at the beginning')
                         ,(4,'one 333 fitting pattern 456.567.678 in the 99.99 middle')
                         ,(5,'several 987.876.765 fitting 876.756.645 patterns 123.234.345');
-- Solution
SELECT      
  Ticket     = m.TicketID, 
  ItemNumber = ROW_NUMBER() OVER (PARTITION BY F.Item ORDER BY (SELECT NULL)),
  Item       =  f.Item
FROM        @mockup AS m
CROSS APPLY dbo.PatternSplitCM(m.[Text],'[0-9.]') AS F
WHERE       f.[Matched]=1 -- has numbers and/or dots
AND         LEN(f.item)-LEN(REPLACE(f.item,'.','')) > 1;  -- has numbers after removing 1+ dots
返回:

Ticket      ItemNumber           Item
----------- -------------------- ------------
2           1                    123.234.345
5           2                    123.234.345
3           1                    234.345.456
4           1                    456.567.678
5           1                    876.756.645
5           1                    987.876.765

样本数据最好作为+。请将您的问题包括在内,您当前的尝试和您想要的结果。关于更多细节,我试着用我的话来说:有一个字符串。该字符串包含由空格分隔的片段。您要查找所有出现的数字点数字点数字。这是正确的吗?顺便说一下:请用完整的RDBMS标签(供应商和版本)标记您的问题。[tsql]指向SQL Server,但这不是tsql上的唯一产品。。。版本很重要,因为许多函数都依赖于此。。。
Ticket      ItemNumber           Item
----------- -------------------- ------------
2           1                    123.234.345
5           2                    123.234.345
3           1                    234.345.456
4           1                    456.567.678
5           1                    876.756.645
5           1                    987.876.765