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

时间:2014-10-08 22:58:05

标签: sql sql-server tsql

一般来说,TSQL和SQL都是新手,请原谅这是非常基本的:

我正在使用一个忽略一些最佳实践的新到我的数据库。与此讨论相关,一些数据存储在广义便条字段中,包括忠诚度数字。好消息是,忠诚度数字至少一直存储在票据中。

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

enter image description here

我已经确认每个忠诚度号码都是一致存储的(“忠诚度号码####”),但显然这并不理想。我想为每个拥有它们的主键提取忠诚度号码,然后创建一个存储忠诚度号码的新字段。

我遇到的问题如下:如何运行一个会给我每个主键的查询,如果有忠诚号码则返回它,如果没有留空或者说没有找到结果的话。例如,将上述内容变成类似的东西。

enter image description here

很容易构建类似“select primary_key,note_table中的注释,其中注意'%忠诚号%',但这不能完成裁剪到忠诚号码(并遗漏无关文本)的工作数据的一致性意味着我可以在Excel中执行此操作,但我想知道它是否可以在TSQL中使用。提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

尝试使用case substringcharindex来尝试这样的事情:

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 NumberSubstring使用charindex拆分注释字段以查找起始位置。这是忠诚号码的4个字符长度的硬编码。鉴于您的意见,这应该工作。如果您有动态数量的字符,则需要稍微修改一下。

答案 1 :(得分:0)

以@ segeddes回答为基础,这是代码的其余部分,它将更新您的新LoyaltyNumber列。

使用SQL小提琴: 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');