SQL Как захватить/проверить определенный текст из стандартного столбца, чтобы заполнить значение для вычисляемого столбца

0

Вопрос

В SQL Server 2016 у меня есть таблица со столбцом varchar (заголовок), в которой есть некоторые значения, как показано ниже

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

Я хочу заполнить значение для вычисляемого (производного) столбца на основе приведенного выше столбца заголовка таким образом, чтобы,

Найдите, содержит ли столбец заголовка текст E00, тогда только производный столбец будет иметь значение E00 иначе NULL

Пример,

Expected Output

Спасибо

2

Лучший ответ

2

Предполагая, что мой вопрос о том, что значение всегда суффиксирует строку, или значение, которое вы хотите, всегда сопровождается правой круглой скобкой, вы можете сделать следующее с некоторыми CHARINDEXs и 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);

бд<>скрипка<>

2021-11-23 23:39:56

Спасибо, @Larnu, но могу ли я заполнить значение производного столбца во время выполнения. В основном при создании синтаксиса таблицы. как только заголовок стандартного столбца получит свое значение на основе этого производного столбца, он должен получить значения E00.. или NULL.
Vikas J

Что вы имеете в виду "Во время выполнения" @VikasJ ? Значение столбца, YourColumn, рассчитывается во время выполнения; время выполнения SELECT.
Larnu

Я имею в виду, что я хочу указать вычисляемый столбец при создании таблицы, которая получит значение E00 или NULL на основе значения стандартного столбца заголовка.
Vikas J

Вам нужно будет взять выражения из приведенного выше и вложить их затем, @VikasJ .
Larnu
1

Одним из вариантов было бы использовать комбинацию Charindex и Substring. Обратите внимание на следующее 100 должна быть только объявленная длина столбца - charindex всегда будет останавливаться в конце строки.

Для этого не требуется заключительная скобка, она ищет последнюю цифру.

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)

Пример Скрипки

Обновить

Вы могли бы реализовать вышесказанное в виде вычисляемого столбца с помощью функции, заменяющей использование apply.

Это может быть хорошо для вашего варианта использования, хотя я бы рекомендовал использовать представление, если это вообще возможно.

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

Смотрите демонстрационную скрипку 2

2021-11-23 10:22:48

Спасибо, @Stu, но могу ли я заполнить значение производного столбца во время выполнения. В основном при создании синтаксиса таблицы. как только заголовок стандартного столбца получит свое значение на основе этого производного столбца, он должен получить значения E00.. или NULL.
Vikas J

@VikasJ теперь вы задаете другой вопрос о вычисляемом столбце - по крайней мере, это не было ясно из вашего вопроса, производный столбец применяется к любому значению, вычисленному из существующего столбца.
Stu

Прошу прощения, если мой вопрос был неясен. Но да, я хочу указать вычисляемый столбец при создании таблицы, которая получит значение E00 или NULL на основе значения стандартного столбца заголовка.
Vikas J

@VikasJ Я предложил обновление выше
Stu

Большое спасибо @Stu, но когда я добавил еще 2 типа заголовка, я не смог получить ожидаемый результат в вычисляемом столбце. Пожалуйста, проверьте результаты последних 2 строк. dbfiddle.uk/...
Vikas J

@VikasJ в то время как я могу изменить это, чтобы справиться с первой новой строки, ваш новый втором ряду нарушает правила вы уже создано, т. е., в последнем ряду теперь нет закрывающей скобки и число это не в конце строки, так что это ни о "двух моделей" вы документально.
Stu

согласен, просто я получил этот новый сценарий последней строки несколько минут назад от Клиента, в котором число может быть в начале или в конце с фигурными скобками или без них. И какие изменения нужно внести, чтобы первая новая строка дала ожидаемый результат? Потому что я пытался внести изменения в выражение Reg patindex %[0-9]%, но это не сработало хорошо.
Vikas J

Поэтому, если вы теперь замените [0-9] закрывающей скобкой, это будет работать для вашей первой новой строки, однако подход должен отличаться с учетом ваших новых критериев. К сожалению, это сдвинутая стойка ворот.
Stu

На других языках

Эта страница на других языках

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