SQL Comment capturer/vérifier un texte particulier à partir de la norme de la colonne à remplir valeur pour la colonne calculée

0

La question

Dans SQL Server 2016, j'ai une table avec une colonne de type varchar (titre) qui a certaines valeurs comme ci-dessous

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

Je veux remplir la valeur de l'calculé (dérivée) de la colonne basée sur le titre ci-dessus de la colonne de telle manière que,

Retrouver Si le titre de la colonne contient du texte E00 alors seulement la colonne dérivée aura la E00 d'autre valeur NULL

Exemple,

Expected Output

Merci

2

La meilleure réponse

2

En supposant que ma question à propos de la valeur toujours les suffixes de la chaîne, ou la valeur que vous voulez, c'est toujours suivie d'une parenthèse fermante, vous pouvez effectuer les opérations suivantes avec certains CHARINDEXs et 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<>violon

2021-11-23 23:39:56

Merci, @Larnu mais puis-je remplir la valeur de la dérivée de la colonne lors de l'exécution. Fondamentalement, lors de la création de la table de la syntaxe. une fois le standard de la colonne titre obtient sa valeur basée sur le fait que la colonne dérivée doit obtenir les valeurs que E00.. ou NULL.
Vikas J

Que voulez-vous dire "Au moment de l'exécution" @VikasJ ? La valeur de la colonne, YourColumn, est calculée au moment de l'exécution; l'exécution de la SELECT.
Larnu

Je veux dire, je veux spécifier une colonne Calculée lors de la création d'un tableau qui vous permettra d'obtenir une valeur de E00 ou NULL basée sur la valeur de la norme du titre de la colonne.
Vikas J

Vous aurez besoin de prendre les expressions ci-dessus et de les imbriquer alors, @VikasJ .
Larnu
1

Une option serait d'utiliser une combinaison de Charindex et Substring. Notez dans l'exemple suivant 100 faut juste être déclarées longueur de la colonne - charindex s'arrête toujours à la fin de la chaîne.

Cela ne nécessite pas de parenthèse de fin, il semble pour le dernier chiffre.

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)

Exemple De Violon

Mise à jour

Vous pourriez mettre en œuvre le dessus, d'une colonne calculée à l'aide d'une fonction de remplacer l'utilisation de l'appliquer.

Cela pourrait être bon pour votre cas d'utilisation, bien que je vous recommande d'utiliser une vue si possible.

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

Voir démo violon 2

2021-11-23 10:22:48

Merci, @Stu, mais puis-je remplir la valeur de la dérivée de la colonne lors de l'exécution. Fondamentalement, lors de la création de la table de la syntaxe. une fois le standard de la colonne titre obtient sa valeur basée sur le fait que la colonne dérivée doit obtenir les valeurs que E00.. ou NULL.
Vikas J

@VikasJ vous êtes maintenant poser une autre question au sujet d'une colonne calculée - au moins ce n'était pas clair à partir de votre question, un dérivé de la colonne s'applique à toute valeur calculée à partir d'une colonne existante.
Stu

Toutes mes excuses Si ma question n'était pas claire. Mais oui, je veux spécifier une colonne Calculée lors de la création d'un tableau qui vous permettra d'obtenir une valeur de E00 ou NULL basée sur la valeur de la norme du titre de la colonne.
Vikas J

@VikasJ j'ai proposé une mise à jour ci-dessus
Stu

Merci beaucoup @Stu, Mais quand j'ai ajouté 2 types de titre, je ne pouvais pas obtenir les résultats escomptés dans la colonne Calculée. Veuillez vérifier les 2 dernières lignes de résultats. dbfiddle.royaume-uni/...
Vikas J

@VikasJ Alors que je peux le modifier pour faire face à la première nouvelle ligne, votre deuxième nouvelle ligne enfreint les règles que vous avez déjà établi, c'est à dire, la dernière ligne n'a pas d'accolade de fermeture et le nombre n'est pas au bout de la chaîne, ce n'est ni de l' "deux modèles de" vous avez documenté.
Stu

convenu C'est juste que j'ai eu ce nouveau scénario de la dernière ligne à quelques minutes de retour à partir du Client, dans lequel le nombre pourrait être au début ou à la fin, avec ou sans bretelles. Et quels sont les changements à faire pour faire la première partie de la nouvelle ligne afin de donner le résultat escompté? Parce que j'ai essayé de faire des changements dans la Reg expression de patindex %[0-9]% mais qui n'a pas bien fonctionné.
Vikas J

Donc, si vous remplacez maintenant le [0-9] avec une accolade de fermeture, il va travailler pour votre première ligne, mais l'approche doit être différente compte tenu des nouveaux critères. Malheureusement, c'est un déplacé poteau.
Stu

Dans d'autres langues

Cette page est dans d'autres langues

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