Mam kolumnę z wartościami w formacie a, b, c, d. Czy istnieje sposób, aby policzyć liczbę przecinków w tej wartości w T-SQL?
sql-server
tsql
Orion Adrian
źródło
źródło
LTRIM
wokół napisu w następujący sposób:SELECT LEN(RTRIM(@string)) - LEN(REPLACE(RTRIM(@string), ',', ''))
?Szybkie rozszerzenie odpowiedzi cmsjr, które działa w przypadku łańcuchów zawierających więcej niż więcej znaków.
Stosowanie:
źródło
dbo.CountOccurancesOfString( 'blah ,', ',')
zwróci 2 zamiast 1 idbo.CountOccurancesOfString( 'hello world', ' ')
zakończy się niepowodzeniem z dzieleniem przez zero.DATALENGTH()/2
jest również trudna z powodu nieoczywistych rozmiarów znaków. Zajrzyj na stackoverflow.com/a/11080074/1094048, aby uzyskać prosty i dokładny sposób.Możesz porównać długość łańcucha z takim, w którym zostały usunięte przecinki:
źródło
Opierając się na rozwiązaniu @ Andrew, uzyskasz znacznie lepszą wydajność przy użyciu nieproceduralnej funkcji wartościującej tabelę i CROSS APPLY:
źródło
Odpowiedź udzielona przez @csmjr zawiera w niektórych przypadkach problem.
Jego odpowiedź brzmiała:
Działa to w większości scenariuszy, jednak spróbuj uruchomić to:
Z jakiegoś powodu polecenie REPLACE usuwa ostatni przecinek, ale RÓWNIEŻ spację tuż przed nim (nie wiem dlaczego). Powoduje to zwrócenie wartości 5, gdy można się spodziewać 4. Oto inny sposób na zrobienie tego, który zadziała nawet w tym specjalnym scenariuszu:
Pamiętaj, że nie musisz używać gwiazdek. Każde zastąpienie dwóch znaków wystarczy. Chodzi o to, że wydłużasz ciąg o jeden znak dla każdego wystąpienia liczonego znaku, a następnie odejmujesz długość oryginału. Jest to w zasadzie metoda odwrotna do oryginalnej odpowiedzi, która nie wiąże się z dziwnym efektem ubocznym przycinania.
źródło
źródło
Zaakceptowana odpowiedź jest poprawna, rozszerzając ją tak, aby używała 2 lub więcej znaków w podłańcuchu:
źródło
Jeśli wiemy, że istnieje ograniczenie dotyczące LEN i przestrzeni, dlaczego nie możemy najpierw zastąpić spacji? Wtedy wiemy, że nie ma miejsca na pomylenie LEN.
źródło
źródło
Myślę, że Darrel Lee ma całkiem dobrą odpowiedź. Wymień
CHARINDEX()
sięPATINDEX()
, i można to zrobić trochę słabyregex
poszukiwania wzdłuż łańcucha, zbyt ...Powiedz, że używasz tego do
@pattern
:Dlaczego miałbyś chcieć zrobić coś tak szalonego?
Powiedzmy, że ładujesz rozdzielone ciągi tekstowe do tabeli pomostowej, w której pole przechowujące dane jest czymś w rodzaju varchar (8000) lub nvarchar (max) ...
Czasami łatwiej / szybciej jest wykonać ELT (wyodrębnij-załaduj-transformację) z danymi zamiast ETL (wyodrębnij-transformuj-załaduj), a jednym ze sposobów na to jest załadowanie rozdzielonych rekordów w postaci, w jakiej są, do tabeli pomostowej, zwłaszcza jeśli możesz chcieć prostszego sposobu, aby zobaczyć wyjątkowe zapisy, zamiast traktować je jako część pakietu SSIS ... ale to święta wojna na inny wątek.
źródło
Poniższe działania powinny załatwić sprawę zarówno w przypadku wyszukiwania pojedynczego znaku, jak i wyszukiwania wielu znaków:
Funkcję można nieco uprościć za pomocą tabeli liczb (dbo.Nums):
źródło
Użyj tego kodu, działa idealnie. Stworzyłem funkcję sql akceptującą dwa parametry, pierwszym parametrem jest długi ciąg, który chcemy w nim przeszukać i może on przyjmować długość ciągu do 1500 znaków (oczywiście możesz go przedłużyć lub nawet zmienić na typ danych tekstowych ). A drugim parametrem jest podłańcuch, który chcemy obliczyć liczbę jego wystąpień (jego długość to maksymalnie 200 znaków, oczywiście możesz go zmienić na taką, jakiej potrzebujesz). a wyjście jest liczbą całkowitą, reprezentuje liczbę częstotliwości… ciesz się tym.
źródło
W końcu piszę tę funkcję, która powinna obejmować wszystkie możliwe sytuacje, dodając prefiks i sufiks znaku do wejścia. ten znak jest oceniany jako inny niż którykolwiek ze znaków kontekstowych w parametrze wyszukiwania, więc nie może wpływać na wynik.
stosowanie
źródło
źródło
W programie SQL 2017 lub nowszym możesz użyć tego:
źródło
ten kod T-SQL wyszukuje i wypisuje wszystkie wystąpienia wzorca @p w zdaniu @s. możesz później przetworzyć wyrok.
wynik to: 1 6 13 20
źródło
dla programu SQL Server 2017
źródło
Aby pobrać wartości, można użyć następującej procedury składowanej.
źródło
@c1
odpowiedź, której on potrzebuje. Jaki pożytek jest z pozostałej części kodu, biorąc pod uwagę, że wymaga on wcześniej istniejącej tabeli wywoływanejtable1
do pracy, ma zakodowany na stałe ogranicznik i nie może być używany w tekście, jak zaakceptowana odpowiedź sprzed dwóch miesięcy?Test Replace / Len jest uroczy, ale prawdopodobnie bardzo nieefektywny (szczególnie pod względem pamięci). Wystarczy prosta funkcja z pętlą.
źródło
Być może nie powinieneś przechowywać danych w ten sposób. Przechowywanie listy rozdzielanej przecinkami w polu jest złą praktyką. IT jest bardzo nieefektywne do wykonywania zapytań. To powinna być powiązana tabela.
źródło