Jsou občas situace, kdy si zaťukáte na čelo "Jak tohle mohl někdo vymyslet". Třeba dnes jsem řešil v podnikovém IS přepočet jednotek na kartách zboží. Nějaký můj předchůdce vyrobil na kartách zboží "okýnko" do kterého se zapisuje přepočítací koeficient. A to tak že včetně měrných jednotek takže např: "18,33 kg/m" No a teď po mě chtějí naprogramovat počítatelný sloupec, kde se bude automaticky počítat hmotnost skladové položky. A jak mám asi násobit textovým řetězcem? :-)
Takže řešením bylo naprogramovat dva nové sloupce - číselný pro koeficient a textový pro měrné jednotky. No a aby obchoďáci nemuseli přepisovat hodnoty asi u 13 tisíc karet, vyrobil jsem si script na nakrmení nových polí z původních hodnot.

Zde je skript a lze použít i na jakékoliv vyseparování textových nebo číselných hodnot ze smíšeného řetězce.

Nutno dodat, že k výsledku jsem došel ještě i jinou cestou, ale nakonec jsem si pro univerzálnost zvolil toto řešení.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
DECLARE @Vstup nvarchar(30)          
DECLARE @Znak nvarchar(1)
DECLARE @CisloText nvarchar(100)
DECLARE @Cislo numeric(19,2)
DECLARE @Text nvarchar(100)
DECLARE @DelkaRetezce int
 
SELECT @Vstup = REPLACE (@Vstup,',','.')	-- nahrazení čárky za tečku u deset.č
SELECT @Vstup = LTRIM(RTRIM (@Vstup))		-- odstraneni mezer na zacatku a konci
 
SELECT @DelkaRetezce = LEN(@Vstup)		-- délka řetězce (počet cyklů smyčky)
 
-- začátek smyčky
WHILE @DelkaRetezce > 0   
BEGIN
 
SELECT @Znak =  RIGHT (@Vstup,1)		-- poslední znak řetězce
 
IF @Znak NOT LIKE '[0-9.]'			   -- posouzení, zda se jedná o číslo
SELECT @Text = CONCAT (@Znak, @Text)	           -- sloučení znaků v případě textu 
ELSE
SELECT @CisloText = CONCAT (@Znak, @CisloText)	-- sloučení znaků v případě čísla
 
SELECT @Vstup = STUFF (@Vstup,@DelkaRetezce,1,'') -- odmazání posledního znaku
SET @DelkaRetezce = @DelkaRetezce -1		  -- snizeni poctu cyklu o jeden
 
END
-- konec smyčky 
  
SELECT @Text = LTRIM(RTRIM (@Text))		-- odstraneni mezer na zacatku a konci
SELECT @Cislo = (CAST(@CisloText AS Numeric(19,2))) -- přetypování textu na číslo

 

 

Vstup: @Vstup= '18,3 Kg/m'
Výsledek: @Text='Kg/m' , @Cislo = 18.30

Vstup: @Vstup= '   1  8,3   Kg/m  '
Výsledek: @Text='Kg/m' , @Cislo = 18.30

Vstup: @Vstup= 'Ton12da55Kouta44'
Výsledek: @Text='TondaKouta' , @Cislo = 125544.00

Pozn: vstupní proměnná je @Vstup, výstupní jsou @Text a @Cislo

 

Jak skript funguje? Triviálně. Posuzuje vždy poslední znak v řetězci, pokud znak není číslo, přidá ho do proměnné @Text, jinak ho přidá do proměnné @CisloText. Pak poslední znak odmaže a pokračuje opět v porovnávání posledního znaku. Nakonec odstraní mezery na začátku a konce textu a číslo přetypuje z textového řetězce na desetinné číslo.

Jak říkám, k výsledku lze dojít i jinou cestou, ale mě se tato líbí pro možnou modifikaci a užití i na jiné případy.