Witam, poszukuje rozwiązania pozwalającego na wyeliminowanie wszystkich słów nie zawierających żadnej liczby, np.
ciąg : UD12679S ASPL 0001362701 BOSCH Lista EAA152325 EAA 254336 ELSTOCK 01179470 KHD 1179470 KHD LRS02664 LUCAS 560004113 PSH 12030287 ROBERT'S
zamienić na ciąg: UD12679S 0001362701 EAA152325 254336 01179470 1179470 LRS02664 560004113 1203028
select string_agg(wyraz, ' ') from unnest(string_to_array('UD12679S ASPL 0001362701 BOSCH Lista EAA152325 EAA 254336 ELSTOCK 01179470 KHD 1179470 KHD LRS02664 LUCAS 560004113 PSH 12030287 ROBERT''S'::text, ' ')) x(wyraz) where wyraz~'[0-9]'
Niestety nie znam się aż tak na SQL, jak trzeba by to przetransformować, aby użyć tego na zasadzie UPDATE [tabela] SET [pole] = ?
Z góry dzięki :D
Trochę nie wiem w czym masz problem, bo opisałeś to trochę nieprecyzyjnie, możliwe, że chodzi o coś takiego, że masz tabelkę
id | co1 |
---|---|
1 | {UD12779T,ASPL,0001362701,BOSCH,Lista,EAA152325,EAA,254336,ELSTOCK,01179470,KHD,1179470,KHD,LRS02664,LUCAS,560004113,PSH,12030287,ROBERT'S} |
2 | {UD12679R,ASPL,0001362701,BOSCH,Lista,EAA152325,EBB,434343,AASTOCK,01179470,GGG,1179470,KHD,LRS02664,MATH,560004113,PSH,12030287,MACIEJ'K} |
3 | {ER12679S,GFDR,0001362701,BOSCH,Lista,EAA444425,ECC,254336,ELSTOCK,01133470,KHD,1179470,AAA,LRS02664,BARD,560004113,PSH,12030287,ANNA'U} |
i chesz uzyskać coś takiego:
id | col1 |
---|---|
1 | "{UDT,ASPL,BOSCH,Lista,EAA,EAA,ELSTOCK,KHD,KHD,LRS,LUCAS,PSH,ROBERT'S}" |
2 | "{UDR,ASPL,BOSCH,Lista,EAA,EBB,AASTOCK,GGG,KHD,LRS,MATH,PSH,MACIEJ'K}" |
3 | "{ERS,GFDR,BOSCH,Lista,EAA,ECC,ELSTOCK,KHD,AAA,LRS,BARD,PSH,ANNA'U}" |
Wówczas nie wiem jak w mssql
ale w postgresie
zadziała coś takiego:
UPDATE tmp_table
SET col1 = string_to_array(replace(regexp_replace(array_to_string(col1, ' ') , '[0-9]', '', 'g'), ' ', ' '), ' ');
To może wyjaśnię dokładnie. Mam skrypt który kasuje niepotrzebne spacje oraz znaki specjalne, teraz chciałbym rozszerzyć go o kasowanie "wyrazów" bez żadnych cyfr, tzn. BOSCH ma zostać skasowane, a BO1447 już nie. Na tę chwilę kod wygląda tak:
UPDATE ModelDanychContainer.Asortymenty
SET
Opis = LTRIM(
RTRIM(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
Opis
, '/', '')
, '.', '')
, ',', '')
, '-', '')
, '*', '')
, CHAR(13) + CHAR(10), ' ')
, CHAR(0010),' ')
,' ',' ')
)
)
Nie da się tego zrobić za pomocą wbudowanych funkcji tsql-a ale można napisać własną;
CREATE FUNCTION [dbo].[tylkowyrazyzcyframi]
(@x nvarchar(max))
RETURNS nvarchar(max)
AS
BEGIN
declare @wynik varchar(max),
@xml xml
set @xml = '<t><r>' + replace(@x,' ','</r><r>') + '</r></t>'
select
@wynik = dbo.GROUP_CONCAT_D(w,N' ')
FROM (
select
t.value('.','varchar(250)') as [w]
from
@xml.nodes('//t/r') as a(t)) dt
where
w like '%[0-9]%'
RETURN ISNULL(@wynik,'')
END
GO
Wykorzystuje funkcje CLR opisaną tutaj: https://4programmers.net/Forum/Bazy_danych/287284-laczenie_wierszy
Wtedy zapytanie:
select [dbo].[tylkowyrazyzcyframi](N'UD12679S ASPL 0001362701 BOSCH Lista EAA152325 EAA 254336 ELSTOCK 01179470 KHD 1179470 KHD LRS02664 LUCAS 560004113 PSH 12030287')
zwróci:
UD12679S 0001362701 EAA152325 254336 01179470 1179470 LRS02664 560004113 12030287
Czyli w twoim zapytaniu, można tak:
UPDATE ModelDanychContainer.Asortymenty
SET
Opis =
[dbo].[tylkowyrazyzcyframi](
LTRIM(
RTRIM(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
Opis
, '/', '')
, '.', '')
, ',', '')
, '-', '')
, '*', '')
, CHAR(13) + CHAR(10), ' ')
, CHAR(0010),' ')
,' ',' ')
)
)
)
po użyciu wyskakuje Msg 4121, Level 16, State 1, Line 4 Cannot find either column "t" or the user-defined function or aggregate "t.VALUE", or the name is ambiguous.
Nie wiem skąd taki błąd, ale co zwróci taki skrypt:
declare @x as nvarchar(500)
, @xml xml
set @x = N'UD12679S ASPL 0001362701 BOSCH Lista EAA152325 EAA 254336 ELSTOCK 01179470 KHD 1179470 KHD LRS02664 LUCAS 560004113 PSH 12030287'
set @xml = '<t><r>' + replace(@x,' ','</r><r>') + '</r></t>'
select
t.value('.','varchar(250)') as [w]
from
@xml.nodes('//t/r') as a(t)
select
dbo.GROUP_CONCAT_D(w,N' ') w
FROM (
select
t.value('.','varchar(250)') as [w]
from
@xml.nodes('//t/r') as a(t)) dt
where
w like '%[0-9]%'
Tak samo, http://screenshot.sh/m7QMsadBUYfEL
Dziwne, a to:
DECLARE @x AS nvarchar(500)
, @xml xml
SET @x = N'UD12679S ASPL 0001362701 BOSCH Lista EAA152325 EAA 254336 ELSTOCK 01179470 KHD 1179470 KHD LRS02664 LUCAS 560004113 PSH 12030287'
SET @xml = '<t><r>' + REPLACE(@x,' ','</r><r>') + '</r></t>'
SELECT
a.t.value('.','varchar(250)') AS [w]
FROM
@xml.nodes('//t/r') AS a(t)
SELECT
t.value('.','varchar(250)') AS [w]
FROM
@xml.nodes('//t/r') AS a(t)
zmiań VALUE na value, bo to zmienia coyote na wielkie litery
Wynik z ostatniego: http://screenshot.sh/m9mwOjCqxUjVN
Natomiast po zmianie we wcześniejszej funkcji VALUE na value wyskakuje inny błąd:
Msg 4121, Level 16, State 1, Line 1
Cannot find either column "dbo" or the user-defined function or aggregate "dbo.GROUP_CONCAT_D", or the name is ambiguous.
The statement has been terminated.
screen: http://screenshot.sh/n9LUtdpD3cRZN
A zinstalowaleś to Assembly z wątku który podalem i czy serwer ma włączone CLR
Podczas instalacji tego Assembly w use użyłem złej bazy danych, teraz wydaje mi się, że wszystko jest ok. Dzięki wielkie :D
Od jakiegoś czasu mam problem - wykonując taką funkcję zacząłem otrzymywać błąd i nie mam pomysłu od czego zacząć:
Msg 9455, Level 16, State 1, Line 2
XML parsing: line 1, character 242, illegal qualified name character
skoro wywala się parsowanie xmla to masz tam jakiś znak który trzeba escapować, któryś z tych: < > ' " &
Rzeczywiście, w bazie występował taki znak
Dzięki!