Zapytanie kasujace niepotrzebne znaki

0

Witam, czy mógłby ktoś pomóc napisać zapytanie w SQL, które kasowałoby wszystkie znaki na początku pola, wielokrotne spacje w tekście zamieniałoby na pojedyncze, oraz kasowałoby niepotrzebne spacje na końcu pola.

Dodatkowo, czy jest możliwość zamiany znaku przejścia do nowej linii na znak spacji?
np.
153513
16513
15314
1351
zamienić na ciąg 153513 16513 15314 1351
Kasowanie znaków specjalnych już udało mi się zrealizować, teraz chciałbym zrobić już takie kompleksowe rozwiązanie
Z góry dziękuję :D

1

W T-SQL:

LTRIM(RTRIM(REPLACE(REPLACE(nazwapola,'  ',''), CHAR(13) + CHAR(10), ' ')))

Przy założeniu, że nowy wiersz jest zapisany jako Carriage return + Line Feed

0

Czyli końcowe rozwiązanie mogłoby mieć taką postać?

use [nexo_<<nazwa podmiotu>>]
update ModelDanychContainer.Asortymenty
set
	Opis = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(Opis, '.', ''), ',', ''), '-', ''), '*', ''), '/', '')
            LTRIM
```(RTRIM(REPLACE(REPLACE(Opis,'  ',''), CHAR(13) + CHAR(10), ' ')))
0

oczywiście chodziło mi o

use [nexo_<<nazwa podmiotu>>]
update ModelDanychContainer.Asortymenty
set
	Opis = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(Opis, '.', ''), ',', ''), '-', ''), '*', ''), '/', '')
            LTRIM(RTRIM(REPLACE(REPLACE(Opis,'  ',''), CHAR(13) + CHAR(10), ' ')))

2

To co proponujesz jest niepoprawne składniowo, zrób tak:

UPDATE ModelDanychContainer.Asortymenty
SET
Opis = LTRIM(
			RTRIM(
				REPLACE(
					REPLACE(
						REPLACE(
							REPLACE(
								REPLACE(
									REPLACE(
										REPLACE(
											Opis
										,'  ','')
									, CHAR(13) + CHAR(10), ' ')
								, '.', '')
							, ',', '')
						, '-', '')
					, '*', '')
				, '/', '')
			)
		)
0

Przy tym rozwiązaniu zauważyłem, że występuje czasem efekt złączenia pól, tzn po przepuszczeniu pola z zawartością


RNL1567   IM653 141..7,0.,5.,3. ...14170.-6-1- 98.6..0.1.5670 



19024080



 DRS5670   ..630002124   ..630018124 22715 451445 8815670 8EA730204001 11139030 AZK5189 IS9030 LRS00799 LRS00799 81467053 81467153 81467253 1646 STR2394 436098 455502  1417053   

Otrzymujemy

RNL1567 IM653 1417053 1417061 986015670 19024080 DRS5670 630002124 630018124 22715 451445 8815670 8EA730204001 11139030 AZK5189 IS9030 LRS00799 LRS00799 81467053 81467153 81467253 1646 STR2394 436098 4555021417053 

Jak widać efekt kasowania znaków specjalnych działa dobrze, efekt kasowania nadmiaru spacji chyba również, ale zastanawiam się dlaczego 2 ostatnie numery zostały połączone. Ponadto nie jest kasowana ostatnia spacja i znak przejścia do nowej linii (myślę, że może być to spowodowane jednoczesnym kasowaniem spacji jak i zamianą "entera" na spację.
Dodam że używam zapytania

UPDATE ModelDanychContainer.Asortymenty
SET
Opis = LTRIM(
            RTRIM(
                REPLACE(
                    REPLACE(
                        REPLACE(
                            REPLACE(
                                REPLACE(
                                    REPLACE(
                                        REPLACE(
                                            Opis
                                        ,'  ','')
                                    , CHAR(13) + CHAR(10), ' ')
                                , '.', '')
                            , ',', '')
                        , '-', '')
                    , '*', '')
                , '/', '')
            )
        )
		WHERE Symbol Like 'CS688 EU RB'

Proszę o pomoc w rozwiązaniu ww. problemów

1

Kolejność wykonywania replace jest istotna, więc zacznij od usunięcia znaków specjalnych,
Sprawa połączenia dwóch ostatnich wyrazów wynika z faktu, że masz pomiedzy nimi dwie spacje, które zamieniasz na pusty string.
Obejście masz tu:
http://stackoverflow.com/questions/2455750/replace-duplicate-spaces-with-a-single-space-in-t-sql

0

Rzeczywiście, mój błąd, nie zauważyłem że zamienia 2 spacje na pusty znak a nie na jedną. Teraz wydaje mi się, że już działa dobrze.
Mam jednak kolejne pytanie, co jeżeli ciąg jest skopiowany z Excela lub z internetu i po wklejeniu okazuje się że przejścia do nowej linii nie są zapisywane jako Carriage return ani Line Feed? Dodam, że próbowałem sposobu z \n oraz \r i również nie działa, a jak usunę te znaki nowej linii ręcznie i zamienię enterem to jest ok.

0

Już sobie poradziłem, trzeba było użyć REPLACE z CHAR(0010)
Forumowiczowi Panczo serdecznie dziękuję, oby takich jak najwięcej :D

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