Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从文本字段中提取子字符串_Sql_Sql Server_Tsql - Fatal编程技术网

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

Sql 从文本字段中提取子字符串,sql,sql-server,tsql,Sql,Sql Server,Tsql,TSQL和SQL一般都是新手,如果这是最基本的,请原谅: 我正在使用一个新的数据库,它忽略了一些最佳实践。与本次讨论相关的是,一些数据存储在通用注释字段中,包括忠诚度数字。好消息是,忠诚数字至少在便笺中保持一致 因此,注释表中的一个简化示例可能是: 我已经验证了每个忠诚度编号都是一致存储的忠诚度编号,但显然这并不理想。我想提取每个主键的忠诚度编号,然后创建一个存储忠诚度编号的新字段 我遇到的问题是:我如何运行一个查询,将给我每个主键,然后,如果有一个忠诚的数字返回它,如果不保留它为空,或者说没有

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