一般来说,TSQL和SQL都是新手,请原谅这是非常基本的:
我正在使用一个忽略一些最佳实践的新到我的数据库。与此讨论相关,一些数据存储在广义便条字段中,包括忠诚度数字。好消息是,忠诚度数字至少一直存储在票据中。
因此,注释表中的简化示例可能是:
我已经确认每个忠诚度号码都是一致存储的(“忠诚度号码####”),但显然这并不理想。我想为每个拥有它们的主键提取忠诚度号码,然后创建一个存储忠诚度号码的新字段。
我遇到的问题如下:如何运行一个会给我每个主键的查询,如果有忠诚号码则返回它,如果没有留空或者说没有找到结果的话。例如,将上述内容变成类似的东西。
很容易构建类似“select primary_key,note_table中的注释,其中注意'%忠诚号%',但这不能完成裁剪到忠诚号码(并遗漏无关文本)的工作数据的一致性意味着我可以在Excel中执行此操作,但我想知道它是否可以在TSQL中使用。提前感谢您的帮助。
答案 0 :(得分:2)
尝试使用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 note
case
语句检查数据中是否存在Loyalty Number
。 Substring
使用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
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');