Supposons que j'ai une valeur de 4.9.
Je voudrais split 4 et .9 … Comment puis-je le faire?
Je pourrais isoler 4 en utilisant FLOOR (). Qu'en est-il du .9? Comment puis-je l'isoler?
J'utilise t-sql sql server 2005/2008
4.9%1
Vous pouvez faire le module split 1.
Declare @money money Set @money = 418.75 Select convert(int,@money - (@money % 1)) as 'LeftPortion' ,convert(int, (@money % 1) * 100) as 'RightPortion'
Le plus facile que je puisse penser serait
SELECT IntegerPart = cast(4.9 AS int), DecimalPart = 4.9 - cast(4.9 AS int)
De nombreux process d'import de données mainframe (malheureusement répandus dans le secteur financier) nécessitent un file d'input de colonne à largeur fixe qui définit des nombres à floating point avec quelques colonnes pour la valeur entière et quelques colonnes pour la valeur décimale. C'est à dire qu'ils veulent le nombre 4.019 représenté comme 000401900, où les 4 premiers caractères correspondent à l'entier et les 5 derniers correspondent à la composante décimale.
Pour cette application, vous devez faire une bonne quantité de manipulation de strings, mais un bon début est d'get une requête qui vous donne deux champs contenant 4 et '01900'.
Parsename () couplé à str () fait l'affaire:
select integer_part = lsortingm(str(4.019,25,0)), decimal_part = parsename(str(4.019, 25, 5),1)
str () pads avec des espaces sur la gauche, de sorte que vous avez besoin de lsortingm pour l'entier. Vous pourriez juste lancer un int ici à la place. Parsename ne fait que parser les jetons de string séparés par des points.
Voici un gotcha avec cette méthode. Veillez à ne pas embrouiller le type de données de votre colonne decimal_part:
select integer_part = 1, decimal_part = 4 union all select integer_part = lsortingm(str(4.019,25,0)), decimal_part = parsename(str(4.019, 25, 5),1)
résulte en:
integer_part decimal_part 1 4 4 1900
Ici le '01900' prévu est devenu 1900. Ainsi:
select integer_part = 1, decimal_part = cast(4 as varchar(32)) union all select integer_part = lsortingm(str(4.019,25,0)), decimal_part = parsename(str(4.019, 25, 5),1)
résulte en:
integer_part decimal_part 1 4 4 01900
Declare @dec decimal(8,2) Set @dec = 23.98 Select Left(@dec, CharIndex('.',@dec)-1) as 'LeftPortion', RIGHT(@Dec, len(@dec) - CharIndex('.',@dec)) as 'RightPortion'
Jetez un oeil à la fonction parsename. Je pense que le code ci-dessous produira les résultats souhaités. select parsename (4.9,2) donne le 4 select parsename (4.9,1) donne le 9 La sortie de parsename peut être directement utilisée comme un nombre tel que select parsename (4.9,2) * 2 donne le vaule 8
Une autre méthode est
select 4.9-CAST (4.9 comme entier)
Une façon de convertir en utilisant PatIndex est la suivante
declare @val nvarchar(10) = '4.9' select LEFT(@val,PATINDEX(N'%[.]%', @val)-1) Int_Val, RIGHT( @val, len(@val) - PATINDEX(N'%[.]%', @val) + 1) Dec_Val
J'ai essayé différentes façons, mais celle-ci ressemble au meilleur qui a bien fonctionné pour moi.
– Pour les numbers
Select Left(COLUMN_NAME, Case When CharIndex('.',COLUMN_NAME) = 0 Then 0 Else CharIndex('.',COLUMN_NAME)-1 END) as 'LeftPortion', RIGHT(COLUMN_NAME, len(COLUMN_NAME) - CharIndex('.',COLUMN_NAME)) as 'RightPortion' From TABLE_NAME
– Pour find Max Lengths
Select COLUMN_NAME, MAX(LEN(Left(COLUMN_NAME, Case When Ind = 0 Then 0 Else Ind-1 END))) as LenBeforedecimal, MAX(LEN(Right(COLUMN_NAME, LEN(COLUMN_NAME) - Ind))) as afterdecimal From (Select COLUMN_NAME, CHARINDEX('.', Cast(COLUMN_NAME as varchar(30))) as Ind From TABLE_NAME) a Group BY COLUMN_NAME