Kasowanie wyrażeń bez liczby SQL

1

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

1
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]'
0

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

2

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'), '  ', ' '), ' ');

0

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),' ')									
					,'  ',' ')										
				)														
			)
2

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: Łączenie 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),' ')                                   
                    ,'  ',' ')                                      
                )                                                       
            )
)
1

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]%'
1

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

0

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

1

A zinstalowaleś to Assembly z wątku który podalem i czy serwer ma włączone CLR

0

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

0

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

1

skoro wywala się parsowanie xmla to masz tam jakiś znak który trzeba escapować, któryś z tych: < > ' " &

0

Rzeczywiście, w bazie występował taki znak

Dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1