繁体   English   中英

从文本字段中提取子字符串

[英]Extract a substring from a text field

TSQL和SQL通常是新手,如果这确实很基础,请原谅:

我正在使用一个新的数据库,该数据库忽略了一些最佳实践。 与该讨论有关,一些数据包括忠诚度编号存储在广义注释字段中。 好消息是,忠诚度编号至少始终存储在注释中。

因此,注释表中的一个简化示例可能是:

在此处输入图片说明

我已经验证了每个会员编号的存储方式都是一致的(“会员编号####”),但是显然这并不理想。 我想为每个拥有主号码的主键提取“忠诚度编号”,然后创建一个存储“忠诚度编号”的新字段。

我遇到的问题如下:我如何运行一个查询,该查询将为我提供每个主键,如果有忠诚度编号,请将其返回,如果不保留为空,或者说类似未找到结果的话。 例如,将以上内容变为类似内容。

在此处输入图片说明

构造诸如“选择primary_key,从note_table中注释,其中注释如'%Loyalty Number%”这样的构造很容易,但这并不能简化为忠诚度数字(并省去多余的文本)。的数据意味着我可能可以在Excel中执行此操作,但是我想知道是否可以在TSQL中进行操作。在此先感谢您的帮助。

给这样的一个尝试使用casesubstringcharindex

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

case语句检查数据中是否存在会员Loyalty Number Substring使用charindex拆分注释字段以查找起始位置。 很难为会员编号编码4个字符的长度。 鉴于您的意见,这应该可行。 如果您拥有动态数量的字符,则需要对此进行一些修改。

在@ segeddes答案的基础上,这是其余代码,它将更新您的新LoyaltyNumber列。

有效的SQL Fiddle: http ://sqlfiddle.com/#!3 / 36e46 / 8

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

表定义和CRUD

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');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM