SQL Cum pentru a captura/verifica un text special de la standard de coloană pentru a popula valoare pentru o coloană calculată

0

Problema

În SQL Server 2016, am un tabel cu un varchar coloana (titlu) care are unele dintre valorile de mai jos

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

Vreau să populeze valoarea calculată (derivate) coloana bazat pe cele de mai sus titlu de coloană în așa fel încât,

Găsi în Cazul în care titlul de coloană conține text E00 atunci numai derivate coloană va avea E00 valoarea NULL altceva

De exemplu,

Expected Output

Multumesc

2

Cel mai bun răspuns

2

Presupunând că întrebarea mea despre valoarea mereu sufixe șir, sau valoarea pe care doriți este întotdeauna terminația de o paranteză dreapta, atunci puteți face următoarele cu unele CHARINDEXs și 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<>vioara

2021-11-23 23:39:56

Multumesc, @Larnu dar pot popula valoarea derivate coloana la runtime. Practic în timp ce crearea de masă sintaxă. odată standard titlu de coloană devine valoare bazate pe derivate coloană ar trebui să ia valori ca E00.. sau NULL.
Vikas J

Cum adică "La run time" @VikasJ ? Valoarea din coloana, YourColumn, este calculată la momentul execuției; când tu a alerga SELECT.
Larnu

Adică vreau să specificați o coloană Calculată în timp ce creați un tabel care va primi o valoare de E00 sau NULL bazat pe valoarea standard titlu de coloană.
Vikas J

Veți avea nevoie pentru a lua expresii în cele de mai sus și cuibul ei, atunci, @VikasJ .
Larnu
1

O opțiune ar fi de a utiliza o combinație de Charindex și Substring. Notă în următoarele 100 ar trebui să fie doar declarată lungimea coloanei - charindex va opri la sfârșitul șirului.

Acest lucru nu are nevoie de încheind paranteza, se pare ca ultima cifră.

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)

Exemplu Vioara

Update

Ai putea pune în aplicare cele de mai sus ca o coloană calculată cu ajutorul de o funcție pentru a înlocui utilizarea de aplica.

Acest lucru ar putea fi bine pentru caz de utilizare, deși mi-ar recomanda folosind o vedere , dacă este posibil.

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

Vezi demo-ul vioara 2

2021-11-23 10:22:48

Multumesc, @Stu dar pot popula valoarea derivate coloana la runtime. Practic în timp ce crearea de masă sintaxă. odată standard titlu de coloană devine valoare bazate pe derivate coloană ar trebui să ia valori ca E00.. sau NULL.
Vikas J

@VikasJ acum pui o altă întrebare despre o coloană calculată - cel puțin acest lucru nu a fost clar la întrebarea dumneavoastră, un derivat coloană se aplică la orice valoare calculată de la o coloană existente.
Stu

Îmi cer scuze Dacă întrebarea mea nu a fost clar. Dar da, vreau să specificați o coloană Calculată în timp ce creați un tabel care va primi o valoare de E00 sau NULL bazat pe valoarea standard titlu de coloană.
Vikas J

@VikasJ am sugerat o actualizare de mai sus
Stu

Multumesc mult @Stu, Dar când am adăugat 2 mai multe tipuri de titlu nu am putut obține rezultatul așteptat în coloană Calculată. Vă rugăm să verificați ultimele 2 randuri rezultate. dbfiddle.uk/...
Vikas J

@VikasJ în Timp ce eu pot să-l modifice pentru a face față cu primul rând, noul doilea rând încalcă regulile deja stabilite, de exemplu, ultimul rând acum nu are bretele de închidere și numărul nu este la sfârșitul șirului, deci nu este nici de "două modele" trebuie documentate.
Stu

de acord doar ca am primit acest nou scenariu în ultimul rând câteva minute înapoi de la Client, în care numărul ar putea fi la începutul sau la sfârșitul, cu sau fără bretele. Și ce schimbări să facă pentru a face primul rând pentru a da rezultatul așteptat? Pentru că am încercat să fac schimbări în Reg expresie a patindex %[0-9]% dar asta n-a funcționat bine.
Vikas J

Deci, dacă acum înlocuiți [0-9] cu un bretele de închidere se va lucra pentru dvs. primul rând nou, cu toate acestea, abordarea trebuie să fie diferită având în vedere noile criterii. Din păcate, aceasta este o mutat goalpost.
Stu

În alte limbi

Această pagină este în alte limbi

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