SQL Come catturare il check di un testo particolare, dalla colonna standard per popolare il valore per la colonna calcolata

0

Domanda

In SQL Server 2016, ho una tabella con una colonna varchar (il titolo) che ha alcuni valori come di seguito

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

Voglio inserire il valore per il calcolo dell' (derivata) della colonna in base al precedente titolo della colonna in modo che,

Se il titolo della colonna contiene il testo E00 quindi solo la colonna derivata avrà la E00 valore NULL altro

Esempio,

Expected Output

Grazie

2

Migliore risposta

2

Supponendo che la mia domanda circa il valore sempre suffissi la stringa o il valore che si desidera è sempre preceduto da una parentesi, poi si possono fare le seguenti con alcuni CHARINDEXs e 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<>violino

2021-11-23 23:39:56

Grazie, @Larnu ma posso inserire il valore della colonna derivata in fase di runtime. Fondamentalmente durante la creazione della tabella di sintassi. una volta che la colonna standard titolo prende il suo valore in base a quella colonna derivata dovrebbe ottenere valori E00.. o NULL.
Vikas J

Cosa intendi per "In fase di esecuzione" @VikasJ ? Il valore della colonna, YourColumn, è calcolata in fase di esecuzione, il tempo di eseguire il SELECT.
Larnu

Voglio dire, voglio specificare una colonna Calcolata durante la creazione di una tabella che si ottiene un valore di E00 o NULL in base al valore del titolo della colonna.
Vikas J

Avrete bisogno di prendere le espressioni di cui sopra e di nido, quindi,, @VikasJ .
Larnu
1

Una possibilità potrebbe essere quella di utilizzare una combinazione di Charindex e Substring. Nota il seguente 100 dovrà essere dichiarata la lunghezza della colonna - charindex si ferma alla fine della stringa.

Ciò non richiede la parentesi di chiusura, guarda per l'ultima cifra.

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)

Esempio Di Violino

Aggiornamento

Si potrebbe implementare il sopra come una colonna calcolata con l'aiuto di una funzione per sostituire l'uso di applicare.

Questo potrebbe essere un bene per il tuo caso, anche se mi consiglia di utilizzare una vista , se possibile.

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

Vedi demo violino 2

2021-11-23 10:22:48

Grazie, @Stu, ma posso inserire il valore della colonna derivata in fase di runtime. Fondamentalmente durante la creazione della tabella di sintassi. una volta che la colonna standard titolo prende il suo valore in base a quella colonna derivata dovrebbe ottenere valori E00.. o NULL.
Vikas J

@VikasJ ora si chiede una diversa domanda su una colonna calcolata , almeno questo non era chiaro dalla tua domanda, una colonna derivata vale per qualsiasi valore calcolato da una colonna esistente.
Stu

Scuse, Se la mia domanda non era chiara. Ma sì, voglio specificare una colonna Calcolata durante la creazione di una tabella che si ottiene un valore di E00 o NULL in base al valore del titolo della colonna.
Vikas J

@VikasJ ho suggerito un aggiornamento di sopra
Stu

Grazie mille @Stu, Ma quando ho aggiunto 2 o più tipi di titolo non ho potuto ottenere l'output previsto nella colonna Calcolata. Si prega di controllare le ultime 2 righe di risultati. dbfiddle.uk/...
Vikas J

@VikasJ Mentre posso modificarla per far fronte con la prima riga, il tuo nuovo seconda fila rompe le regole che hai già stabilito, vale a dire, l'ultima riga, non ha altra parentesi graffa di chiusura e il numero non è alla fine della stringa, in modo che non è né di "due modelli di" aver documentato.
Stu

concordato È solo che ho avuto in questo nuovo scenario dell'ultima fila a pochi minuti dal Client, in cui il numero potrebbe essere all'inizio o alla fine con o senza parentesi graffe. E le modifiche necessarie per rendere la prima nuova riga per dare il risultato atteso? Perché ho provato a fare le modifiche al Reg espressione di patindex %[0-9]*%, ma che non ha lavorato bene.
Vikas J

Quindi, se ora sostituire il [0-9] con una parentesi graffa di chiusura funzionerà per la tua prima riga, tuttavia l'approccio deve essere diverso dato ai vostri criteri. Purtroppo questo è un mosso di un clamoroso palo.
Stu

In altre lingue

Questa pagina è in altre lingue

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