SQL Hesaplanan sütunun değerini doldurmak için standart sütundan belirli bir metni yakalama / denetleme

0

Soru

SQL Server 2016'da, aşağıdaki değerlerden bazılarına sahip bir varchar sütununa (başlık) sahip bir tablom var

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

Yukarıdaki başlık sütununa dayanarak hesaplanan (türetilmiş) sütunun değerini şu şekilde doldurmak istiyorum,

Başlık sütununun E00 metni içerip içermediğini bulun, yalnızca türetilmiş sütun E00 değerine sahip olur else NULL

Örnek,

Expected Output

Teşekkürler

2

En iyi cevabı

2

Sorumun, değerin her zaman dizeyi eklediğini veya istediğiniz değerin her zaman sağ parantez ile eklendiğini varsayarsak, aşağıdakileri bazılarıyla yapabilirsiniz CHARINDEXs ve 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 < >keman<>

2021-11-23 23:39:56

Teşekkürler, @ Larnu ama çalışma zamanında türetilmiş sütunun değerini doldurabilir miyim. Temel olarak tablo sözdizimi oluştururken. standart sütun başlığı, türetilen sütuna göre değerini aldığında, değerleri E00 olarak almalıdır.. ya da BOŞ.
Vikas J

@VikasJ" Çalışma zamanında " ne demek? Sütunun değeri, YourColumn, çalışma zamanında hesaplanır; çalıştırdığınız zaman SELECT.
Larnu

Demek istediğim, standart başlık sütununun değerine göre E00 veya NULL değerini alacak bir tablo oluştururken Hesaplanmış bir sütun belirtmek istiyorum.
Vikas J

Yukarıdakilerin ifadelerini almanız ve onları yuvalamanız gerekecek, @VikasJ .
Larnu
1

Bir seçenek, aşağıdakilerin bir kombinasyonunu kullanmak olacaktır Charindex ve Substring. Aşağıdakilere dikkat edin 100 sadece sütunun bildirilen uzunluğu olmalıdır-charındex her zaman dizenin sonunda duracaktır.

Bu, parantezin bitmesini gerektirmez, son rakamı arar.

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)

Örnek Keman

Güncelleme

Yukarıdakileri, apply kullanımını değiştirmek için bir işlev yardımıyla hesaplanmış bir sütun olarak uygulayabilirsiniz.

Bu, kullanım durumunuz için iyi olabilir, ancak mümkünse bir görünüm kullanmanızı tavsiye ederim.

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

Bakın demo keman 2

2021-11-23 10:22:48

Teşekkürler, @Stu ancak çalışma zamanında türetilmiş sütunun değerini doldurabilir miyim. Temel olarak tablo sözdizimi oluştururken. standart sütun başlığı, türetilen sütuna göre değerini aldığında, değerleri E00 olarak almalıdır.. ya da BOŞ.
Vikas J

@VikasJ şimdi hesaplanmış bir sütun hakkında farklı bir soru soruyorsunuz - en azından bu sorunuzdan net değildi, türetilmiş bir sütun mevcut bir sütundan hesaplanan herhangi bir değere uygulanır.
Stu

Sorum açık değilse özür dilerim. Ancak evet, standart başlık sütununun değerine göre E00 veya NULL değerini alacak bir tablo oluştururken Hesaplanmış bir sütun belirtmek istiyorum.
Vikas J

@VikasJ Yukarıda bir güncelleme önerdim
Stu

Çok teşekkür ederim @Stu, Ancak 2 tür daha başlık eklediğimde Hesaplanan sütunda beklenen çıktıyı alamadım. Lütfen son 2 satır sonuçlarını kontrol edin. dbfiddle.uk/...
Vikas J

@VikasJ İlk yeni satırla başa çıkmak için değiştirebilsem de, yeni ikinci satırınız daha önce belirlediğiniz kuralları çiğniyor, yani son satırın artık kapanış ayracı yok ve sayı dizenin sonunda değil, belgelediğiniz "iki kalıp" da değil.
Stu

kabul ettim, sadece son satırın bu yeni senaryosunu müşteriden birkaç dakika geri aldım, burada sayı parantezli veya parantezsiz olarak başında veya sonunda olabilir. Ve beklenen sonucu vermek için ilk yeni satırı yapmak için ne gibi değişiklikler yapmalı? Çünkü patindex %[0-9] % ' in Reg ifadesinde değişiklik yapmaya çalıştım ama bu iyi çalışmadı.
Vikas J

Bu nedenle, şimdi [0-9] ' u bir kapanış ayracı ile değiştirirseniz, ilk yeni satırınız için çalışacaktır, ancak yeni ölçütleriniz göz önüne alındığında yaklaşımın farklı olması gerekir. Ne yazık ki bu hareketli bir kale direği.
Stu

Diğer dillerde

Bu sayfa diğer dillerde

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