SQL Jak uchwycić/sprawdzić pewien tekst ze standardowego kolumny, aby wypełnić wartość dla kolumny obliczanej

0

Pytanie

W SQL Server 2016 mam tabela z kolumną varchar (nagłówek), w którym istnieją pewne wartości, jak pokazano poniżej

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

Chcę wypełnić znaczenie dla obliczeniowego (pochodnej) kolumny na podstawie powyższego nagłówka kolumny w taki sposób, aby,

Znajdź, czy zawiera nagłówek kolumny tekst E00, to tylko pochodna kolumna będzie mieć wartość E00 inaczej NULL

Przykład

Expected Output

Dziękuję

2

Najlepsza odpowiedź

2

Zakładając, że moje pytanie o tym, że wartość zawsze суффиксирует ciąg znaków lub wartość, którą chcesz, zawsze towarzyszy prawym okrągły zamykający, można wykonać następujące czynności z niektórymi 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);

obd<>skrzypce<>

2021-11-23 23:39:56

Dziękuję, @Larnu, ale czy mogę wypełnić wartość pochodnej kolumny w czasie wykonywania. Głównie przy tworzeniu składni tabeli. jak tylko nagłówek standardowego kolumny otrzyma swoją wartość na podstawie tej pochodnej kolumny, musi uzyskać wartości E00.. lub NULL.
Vikas J

Co masz na myśli "W trakcie wykonywania" @VikasJ ? Wartość kolumny, YourColumn, jest obliczana w czasie wykonywania; czas realizacji SELECT.
Larnu

Mam na myśli, że chcę wskazać kolumny obliczanej przy tworzeniu tabeli, która otrzyma wartość E00 lub NULL na podstawie wartości standardowej kolumny nagłówka.
Vikas J

Trzeba będzie wziąć wyrażenia z powyższego i włożyć je następnie, @VikasJ .
Larnu
1

Jedną z opcji byłoby użyć kombinacji Charindex i Substring. Należy zwrócić uwagę na następujące kwestie 100 musi być zadeklarowana długość kolumny - funkcja charindex zawsze będzie zatrzymywać się na końcu wiersza.

Do tego nie jest wymagane końcowe nawias, ona szuka ostatnią cyfrę.

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)

Przykład Skrzypce

Zaktualizować

Czy można by zrealizować powyższe w formie kolumny obliczanej za pomocą funkcji, lub używanie apply.

To może być dobre dla twojego wariantu użycia, choć polecam użyć widoku, jeśli to w ogóle możliwe.

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

Zobacz demo skrzypce 2

2021-11-23 10:22:48

Dziękuję, @Stu, ale czy mogę wypełnić wartość pochodnej kolumny w czasie wykonywania. Głównie przy tworzeniu składni tabeli. jak tylko nagłówek standardowego kolumny otrzyma swoją wartość na podstawie tej pochodnej kolumny, musi uzyskać wartości E00.. lub NULL.
Vikas J

@VikasJ teraz zadajesz kolejne pytanie o kolumnie obliczeniowej - przynajmniej to nie było jasne z twojego pytania, pochodzi kolumna odnosi się do żadnej wartości obliczonej z istniejącej kolumny.
Stu

Przepraszam, jeśli mój problem został wyjaśniony. Ale tak, chcę wskazać kolumny obliczanej przy tworzeniu tabeli, która otrzyma wartość E00 lub NULL na podstawie wartości standardowej kolumny nagłówka.
Vikas J

@VikasJ zaproponowałem aktualizacja powyżej
Stu

Wielkie dzięki @Stu, ale gdy dodałem jeszcze 2 typ nagłówka, nie byłem w stanie uzyskać oczekiwany wynik w kolumnie obliczeniowej. Proszę sprawdzić wyniki ostatnich 2 linii. dbfiddle.uk/...
Vikas J

@VikasJ w tym czasie jak mogę to zmienić, aby poradzić sobie z pierwszej nowej linii, twój nowy drugim rzędzie narusza zasady już stworzony, czyli w ostatnim rzędzie teraz nie ma nawiasu zamykającego i liczba nie jest to na końcu wiersza, więc to nie o "dwóch modeli" jesteś udokumentowane.
Stu

zgadzam się, po prostu mam ten nowy scenariusz ostatniego wiersza kilka minut temu od Klienta, w którym liczba może być na początku lub na końcu z szelkami lub bez nich. I jakie zmiany trzeba wprowadzić, aby pierwsza nowa linia dała oczekiwany rezultat? Bo próbowałem wprowadzić zmiany w ekspresji Reg patindex %[0-9]%, ale to nie działa dobrze.
Vikas J

Dlatego, jeśli teraz wymień [0-9] zamykającym, to będzie pracować dla swojej pierwszej nowej linii, jednak podejście musi być dostosowane do nowych kryteriów. Niestety, to jest przesunięty wspornik bramy.
Stu

W innych językach

Ta strona jest w innych językach

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