Sql 从文本字段中提取子字符串
TSQL和SQL一般都是新手,如果这是最基本的,请原谅: 我正在使用一个新的数据库,它忽略了一些最佳实践。与本次讨论相关的是,一些数据存储在通用注释字段中,包括忠诚度数字。好消息是,忠诚数字至少在便笺中保持一致 因此,注释表中的一个简化示例可能是: 我已经验证了每个忠诚度编号都是一致存储的忠诚度编号,但显然这并不理想。我想提取每个主键的忠诚度编号,然后创建一个存储忠诚度编号的新字段 我遇到的问题是:我如何运行一个查询,将给我每个主键,然后,如果有一个忠诚的数字返回它,如果不保留它为空,或者说没有找到结果之类的话。例如,将上述内容转换为类似的内容Sql 从文本字段中提取子字符串,sql,sql-server,tsql,Sql,Sql Server,Tsql,TSQL和SQL一般都是新手,如果这是最基本的,请原谅: 我正在使用一个新的数据库,它忽略了一些最佳实践。与本次讨论相关的是,一些数据存储在通用注释字段中,包括忠诚度数字。好消息是,忠诚数字至少在便笺中保持一致 因此,注释表中的一个简化示例可能是: 我已经验证了每个忠诚度编号都是一致存储的忠诚度编号,但显然这并不理想。我想提取每个主键的忠诚度编号,然后创建一个存储忠诚度编号的新字段 我遇到的问题是:我如何运行一个查询,将给我每个主键,然后,如果有一个忠诚的数字返回它,如果不保留它为空,或者说没有
构造诸如select primary_key、note from note_table之类的内容非常容易,其中的note类似于“%Loyalty Number%”,但这并不能将内容缩减到仅忠诚编号,并省略无关的文本。数据的一致性意味着我可能可以在Excel中这样做,但我想知道在TSQL中是否可能。提前感谢您的帮助。使用substring和charindex提供类似的试用案例: case语句检查数据中是否存在忠诚度编号。子字符串使用charindex拆分注释字段以查找起始位置。这是对忠诚度编号的4个字符的硬编码。根据你的意见,这应该是可行的。如果你有一个动态的字符数,你需要稍微修改一下 以@answer为基础,下面是代码的其余部分,它将更新您的新忠诚号列 工作SQL小提琴: 表定义和积垢
您可以更改子字符串note,charindex'Loyalty Number',note+Len'Loyalty Number'+1,4作为子字符串note,charindex'Loyalty Number',note,19,因为长度是固定的。@jpw-是的,我同意。我使用了len,以防忠诚度数字的值可能会发生变化,即自年以来的客户。将使修复正在进行的规范化问题变得更加容易。感谢你的评论!正如我发布的那样,我意识到忠诚度和客户的长度是一样的:D
select id,
case when note like '%Loyalty Number [0-9][0-9][0-9][0-9]%'
then 'Loyalty Number ' +
substring(note,
charindex('Loyalty Number', note) + Len('Loyalty Number ') + 1, 4)
end as Note
from note
UPDATE note_table
SET LoyaltyNumber =
CASE
WHEN note LIKE '%Loyalty Number [0-9][0-9][0-9][0-9]%'
THEN SUBSTRING(note, CHARINDEX('Loyalty Number', note)
+ LEN('Loyalty Number ') + 1, 4)
ELSE 'Regular Customer'
END
FROM note_table
CREATE TABLE note_table (
id int identity(1,1),
Note VarChar(500),
LoyaltyNumber varchar(20)
)
Insert Into note_table(Note) Values
('Customer Since 2012. Loyalty Number 4747'),
('Loyalty Number 2209'),
('Loyalty Number 2234.Customer Since 2009'),
('Pending Order');