对于一般的TSQL和SQL来说,如果这是基本的,请原谅:
我正在使用一个新的数据库,它忽略了一些最佳实践。与此相关的是,一些数据存储在一个广义的便笺字段中,包括忠诚度数字。好消息是,忠诚度数字至少一直存储在便条中。
因此,便笺表中的一个简化示例可能是:

我已经验证了每个忠诚号都是一致存储的(“忠诚度号####"),但显然这并不理想。我想提取每个主键的忠诚度号码,然后创建一个存储忠诚度号的新字段。
我遇到的问题是:我如何运行一个查询,这个查询将给我每个主键,如果有一个忠诚号,返回它,如果不让它为空,或者说一些类似于找不到结果的话。例如,把上面的东西变成类似的东西。

构建“选择primary_key,来自note_table的备注,比如‘%忠诚度’这样的便条有点简单,但这并不能做到将忠诚度降低到忠诚度的数字(并且省略了无关的文本)。数据的一致性意味着我可能可以在Excel中完成这个任务,但我想知道在TSQL中是否可能这样做。预先感谢您的帮助。
发布于 2014-10-08 23:10:48
尝试将case与substring和charindex结合使用
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 notecase语句检查数据中是否存在Loyalty Number。Substring使用charindex拆分便笺字段以找到起始位置。这是硬编码长度4个字符的忠诚度数字。鉴于你的意见,这应该是可行的。如果您有一个动态数目的字符,您将需要稍微修改这一点。
发布于 2014-10-08 23:24:22
在@塞格德斯答案的基础上,下面是将更新您的新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');https://stackoverflow.com/questions/26267772
复制相似问题