sql-server 从列中抽取一定大小的数据

vwoqyblh  于 2022-10-31  发布在  其他
关注(0)|答案(1)|浏览(135)

我在MS SQL Server 2016中有一个表。该表有一个名为notes varchar(255)的列。notes列中包含的数据包含最终用户的注解条目。
从my_table中选择服务日期和注解

ServiceDate, notes
--------------------------------------
9/1/2022     The order was called in AB13456736
9/1/2022     AB45876453 not setup
9/2/2022     Signature for AB764538334
9/2/2022     Contact for A0943847432
9/3/2022     Hold off on AB73645298
9/5/2022   **Confirmed AB88988476
9/6/2022     /AB9847654 completed

我希望能够从注解列中提取单词AB%。我知道ABxxxxxxx总是10个字符。因为ABxxxxxx总是在不同的位置输入,所以很难使用精确的提取位置来查找。我已经尝试了子字符串()、left()函数,并且因为值AB%总是在不同的位置,所以我无法提取它。有什么方法可以做到这一点吗?
先谢谢你了。

w3nuxt5m

w3nuxt5m1#

假设notes中只有一个AB{string},否则您将需要一个表值函数。
注意nullif()。如果字符串不存在,这基本上是一个故障安全机制。

示例

Declare @YourTable Table ([ServiceDate] varchar(50),[notes] varchar(50))  Insert Into @YourTable Values 
 ('9/1/2022','The order was called in AB13456736')
,('9/1/2022','AB45876453 not setup')
,('9/2/2022','Signature for AB764538334')
,('9/2/2022','Contact for A0943847432')
,('9/3/2022','Hold off on AB73645298')
,('9/5/2022','**Confirmed AB88988476')
,('9/6/2022','/AB9847654 completed')

Select *
      ,ABValue = substring(notes,nullif(patindex('%AB[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',notes),0),10)
 from @YourTable

结果

ServiceDate notes                               ABValue
9/1/2022    The order was called in AB13456736  AB13456736
9/1/2022    AB45876453 not setup                AB45876453
9/2/2022    Signature for AB764538334           AB76453833
9/2/2022    Contact for A0943847432             NULL
9/3/2022    Hold off on AB73645298              AB73645298
9/5/2022  **Confirmed AB88988476             AB88988476
9/6/2022    /AB9847654 completed                NULL

相关问题