首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从文本字段中提取子字符串

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

Stack Overflow用户
提问于 2014-10-08 22:58:05
回答 2查看 444关注 0票数 0

对于一般的TSQL和SQL来说,如果这是基本的,请原谅:

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

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

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

我遇到的问题是:我如何运行一个查询,这个查询将给我每个主键,如果有一个忠诚号,返回它,如果不让它为空,或者说一些类似于找不到结果的话。例如,把上面的东西变成类似的东西。

构建“选择primary_key,来自note_table的备注,比如‘%忠诚度’这样的便条有点简单,但这并不能做到将忠诚度降低到忠诚度的数字(并且省略了无关的文本)。数据的一致性意味着我可能可以在Excel中完成这个任务,但我想知道在TSQL中是否可能这样做。预先感谢您的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-08 23:10:48

尝试将casesubstringcharindex结合使用

代码语言:javascript
复制
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
  • SQL Fiddle演示

case语句检查数据中是否存在Loyalty NumberSubstring使用charindex拆分便笺字段以找到起始位置。这是硬编码长度4个字符的忠诚度数字。鉴于你的意见,这应该是可行的。如果您有一个动态数目的字符,您将需要稍微修改这一点。

票数 2
EN

Stack Overflow用户

发布于 2014-10-08 23:24:22

在@塞格德斯答案的基础上,下面是将更新您的新LoyaltyNumber列的其余代码。

工作SQL: http://sqlfiddle.com/#!3/36e46/8

代码语言:javascript
复制
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

代码语言:javascript
复制
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');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26267772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档