SQL如何捕捉/检查一个特定的文本标准列的填充的价值计算的列

0

的问题

在SQL服务器2016年,我有一个表varchar列(标题),有一些值如下

title
ProALPHA - S - HTML Custom Table implementation (E001445)
IKA CP Implementation (Aus) (E001534-0001)
Test Engagment Integration: (E001637-0003) Non-billable
Customer requests customization for Analytics and Java Migration - E000797
Create list with customers renewing in H2 2020

我想要填写的价值计算的(来源)列根据上述标题列在这样一种方式,

找到如果标题的列中包含的文本E00则仅源列将有E00值别NULL

例,

Expected Output

感谢

2

最好的答案

2

假设我的问题有关的价值总是的后缀串,或者你想要的值总是的后缀通过一个正确的括号,然后你可以做到以下一些 CHARINDEXs和 SUBSTRING:

USE Sandbox;
GO

SELECT V.Title,
       SUBSTRING(V.Title,E.CI,RP.CI - E.CI) AS YourColumn
FROM (VALUES('ProALPHA - S - HTML Custom Table implementation (E001445)'),
            ('IKA CP Implementation (Aus) (E001534-0001)'),
            ('Test Engagment Integration: (E001637-0003) Non-billable'),
            ('Customer requests customization for Analytics and Java Migration - E000797'),
            ('Create list with customers renewing in H2 2020'))V(Title)
      CROSS APPLY (VALUES(NULLIF(CHARINDEX('E00',V.Title),0)))E(CI)
      CROSS APPLY (VALUES(ISNULL(NULLIF(CHARINDEX(')',V.Title,E.CI),0),LEN(V.Title)+1)))RP(CI);

db<>的小提琴

2021-11-23 23:39:56

谢谢,@Larnu但我可以填充的价值来列在运行时间。 基本上,同时创造表语法。 一旦标准列标题获得其价值的基础上,得出柱应该得到的数值为E00..或空。
Vikas J

你是什么意思"在运行时间"@VikasJ? 值柱, YourColumn, 在运行时计算;该次运行 SELECT.
Larnu

我的意思是,我想要指定一个计算列,同时创造一个表格,将会得到有价值的E00或空基于的价值标准的标题的列。
Vikas J

你会需要采取的表达形式在上面筑巢他们然后,@VikasJ.
Larnu
1

一个选择是使用一个组合 CharindexSubstring. 注意到在以下 100 应该只是声明的长度列charindex将永远停留在底string.

这不需要的结尾的括号,它看起来对最后一位数字。

with t as (
    select * from (values 
        ('ProALPHA - S - HTML Custom Table implementation (E001445)'                                    ),
        ('IKA CP Implementation (Aus) (E001534-0001)'                                                                   ),
        ('Test Engagment Integration: (E001637-0003) Non-billable'                                      ),
        ('Customer requests customization for Analytics and Java Migration - E000797'   ),
        ('Create list with customers renewing in H2 2020'                                                           )
    )t(title)
)
select title, 
   Iif(title like '%E00%',Reverse(Substring(part,patindex('%[0-9]%',part),100)),null)
from t
cross apply (values( Reverse(Substring(t.title, CharIndex('E00',t.title), 100 )) ))x(part)

例如小提琴

更新

可以 实现上述作为 计算列 的帮助的一个 功能 来代替使用中的 应用.

这可能是罚款使用情况,虽然我建议使用一个 ,如果在所有可能的。

create function dbo.E00_Part(@title varchar(100))
returns varchar(100)
as
begin
    return (select Reverse(Substring(@title, CharIndex('E00',@title), 100 )))
end

create table T (title varchar(100), 
  Computed as Iif(title like '%E00%',
    Reverse(Substring(dbo.E00_Part(title),patindex('%[0-9]%',dbo.E00_Part(title)),100)),null))

看到演示的小提琴2

2021-11-23 10:22:48

谢谢,@汕的但是我可以填充的价值来列在运行时间。 基本上,同时创造表语法。 一旦标准列标题获得其价值的基础上,得出柱应该得到的数值为E00..或空。
Vikas J

@VikasJ现在你却要求一个不同的问题有关 的计算列 -至少这不清楚自己的问题,得出列适用于任何价值计算从现有的柱。
Stu

抱歉,如果我的问题不清楚。 但是,我要指定一个计算列,同时创造一个表格,将会得到有价值的E00或空基于的价值标准的标题的列。
Vikas J

@VikasJ我曾建议更新上
Stu

谢谢你这么多@Stu,但是当我增加了2个多种类型的标题我不能获得预期的产出在计算列。 请查看最后2行的结果。 dbfiddle.英国/...
Vikas J

@VikasJ的话,我可以修改它要应对的第一个新的行你的新的第二行中断的规则已经确立,即,最后一行,现在没有关闭括号和数量不是在结尾的字符串,因此既不是"两个模式,"你已经记录在案。
Stu

同意我只是有这个新方案的最后一行一个几分钟后从客户,其中的数目可能在开始或结束,或者没有括号。 和什么样的变化做出第一新行得到预期的结果? 因为我试图改变Reg表达的patindex%[0-9]%,但并没有运作良好。
Vikas J

所以如果你现在替换[0-9]有关振它的工作对于你的第一个新的排,但是该方法的需要是不同的,给你的新标准。 不幸的是,这是一个移动球门柱.
Stu

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................