SQL, Jak zachytit/zkontrolujte, zda konkrétní text ze standardního sloupce k naplnění hodnoty pro vypočtené sloupce

0

Otázka

V SQL Server 2016, mám tabulku s varchar sloupce (název), že se některé z hodnot, jak je uvedeno níže

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

Chci naplnit hodnoty vypočtené (odvozené) sloupec na základě výše uvedeného název sloupce takovým způsobem,že

Najít Pokud název sloupce obsahuje text E00 pak jen odvozený sloupec bude mít E00 hodnotu, jinak NULL

Příklad,

Expected Output

Díky

2

Nejlepší odpověď

2

Za předpokladu, že na mou otázku o tom, že hodnota vždy přípony řetězec, nebo hodnotu, kterou chcete, je vždy doplněno o pravou závorku, pak můžete udělat následující s některými CHARINDEXs a 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<>housle

2021-11-23 23:39:56

Díky, @Larnu ale mohu naplnit hodnoty odvozené sloupce za běhu. V podstatě při vytváření tabulky syntaxe. jakmile standardní sloupci název dostane jeho hodnotu na základě toho odvozený sloupec by měl dostat hodnoty jako E00.. nebo NULL.
Vikas J

Co myslíš tím "Při spuštění" @VikasJ ? Hodnota sloupec, YourColumn, je vypočítána při spuštění čas, čas spuštění SELECT.
Larnu

Chci zadat Vypočítaný sloupec při vytváření tabulky, která bude mít hodnotu E00 nebo NULL na základě hodnoty standardní název sloupce.
Vikas J

Budete potřebovat, aby se výrazy ve výše uvedených a hnízdo je pak, @VikasJ .
Larnu
1

Jednou z možností by bylo použít kombinaci Charindex a Substring. Poznámka: v následujících 100 měl by být jen prohlásil, délka kolony - charindex vždy zastaví na konci řetězce.

To nebude vyžadovat, konec závorky, vypadá to na poslední číslici.

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)

Například Housle

Aktualizace

Ti se mohli realizovat výše uvedené jako vypočítaný sloupec s pomocí funkce nahradit používání platí.

To může být v pořádku pro vaše použití-v případě, I když bych doporučit pomocí zobrazení , pokud je to vůbec možné.

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

Viz demo housle 2

2021-11-23 10:22:48

Díky, @Stu, ale mohu naplnit hodnoty odvozené sloupce za běhu. V podstatě při vytváření tabulky syntaxe. jakmile standardní sloupci název dostane jeho hodnotu na základě toho odvozený sloupec by měl dostat hodnoty jako E00.. nebo NULL.
Vikas J

@VikasJ teď se ptáte na různé otázky o vypočítaný sloupec - alespoň to nebylo jasné z vašeho otázku, odvozený sloupec platí pro libovolné hodnoty vypočtené z existujícího sloupce.
Stu

Omlouvám se, Pokud můj dotaz není jasné. Ale ano, chci zadat Vypočítaný sloupec při vytváření tabulky, která bude mít hodnotu E00 nebo NULL na základě hodnoty standardní název sloupce.
Vikas J

@VikasJ jsem navrhl aktualizaci výše
Stu

Děkuji moc @Stu, Ale když jsem přidal další 2 typy titul nemohl jsem se dostat očekávaný výstup v Vypočítaný sloupec. Prosím, podívejte se na poslední 2 řádky výsledků. dbfiddle.uk/...
Vikas J

@VikasJ Dokud můžu změnit, aby to vyrovnat se s první nový řádek, nový druhý řádek poruší pravidla, které jste již zavedené, tj, poslední řádek má nyní žádné uzavírací závorka a číslo není na konci řetězce, takže je ani "dva vzory" máte zdokumentované.
Stu

shodli, že je To jen, že jsem dostal tento nový scénář z poslední řadě pár minut zpět od Klienta, přičemž číslo může být na začátku nebo na konci s nebo bez závorek. A jaké změny provést, aby se první nový řádek dát očekávaný výsledek? Protože jsem se snažil, aby změny v Reg výraz patindex %[0-9]%, ale že jsem nepracoval dobře.
Vikas J

Takže pokud jste nyní nahradit [0-9] s uzavírací závorka to bude fungovat pro váš první nový řádek, ale přístup musí být jiné vzhledem k novým kritériím. Bohužel to je přesunut tyči.
Stu

V jiných jazycích

Tato stránka je v jiných jazycích

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