T-SQL – kilka przykładów zastosowania tabeli liczb całkowitych

2013-05-09

W poprzednim wpisie pokazałem kilka sposobów na wygenerowanie zbioru kolejnych liczb całkowitych. Dzisiaj zaprezentuję wykorzystanie tych danych w kilku przypadkach. Zacznijmy od przygotowania tabeli zawierającej 100 liczb, będzie ona używana w każdym z prezentowanych przykładów:

declare @Numbers table (N int);
with Numbers
as
(
    select 1 as Number
    union all
    select Number + 1 from Numbers where Number < 100
)
insert into @Numbers(N)
select Number from Numbers option (maxrecursion 100)

Generowanie dat

Poniższe zapytanie zwraca daty oraz informację o dniu tygodnia dla wszystkich dni znajdujących się pomiędzy dwoma datami:

set datefirst 1
declare @beginDate date = '20130501', @endDate date = '20130731'

select
	DateAdd(dd, N - 1, @beginDate) as [Date],
	case DatePart(dw, DateAdd(dd, N - 1, @beginDate))
		when 1 then 'Pn'
		when 2 then 'Wt'
		when 3 then 'Śr'
		when 4 then 'Cz'
		when 5 then 'Pi'
		when 6 then 'So'
		when 7 then 'Ni'
	end as [WeekDay]
from @Numbers
where DateAdd(dd, N - 1, @beginDate) <= @endDate

tally1

Luki w numeracji

Załóżmy, że mamy tabelę zawierającą określone wartości liczbowe:

declare @Values table (value int)
insert into @Values (value)
values (1),(3),(4),(5),(8),(10)

select * from @Values

tally2

Poniżej znajduje się zapytanie zwracające luki w numeracji:

declare @minValue int, @maxValue int
select @minValue = min(value), @maxValue = max(value)
from @Values

select N as Value
from @Numbers n
	left join @Values v on v.value = n.N
where n.N between @minValue and @maxValue
	and v.value is null

tally3

Pozycje występowania danego znaku w tekście

Zapytanie zwraca numery pozycji w tekście, na których znajduje się określony znak:

declare @text varchar(100) = 'to jest przykładowy tekst'
declare @char char(1) = 't'

select N as [CharIndex]
from @Numbers
where SubString(@text, N, 1) = @char and N <= Len(@text)

tally4

Litery występujące w tekście

Poniższe zapytanie zwraca wszystkie litery z podanego tekstu wraz z kodami Ascii oraz liczbą wystąpień:

declare @text varchar(100) = 'to jest przykładowy tekst'

select
	SubString(@text, N, 1) as [Char],
	Ascii(SubString(@text, N, 1)) as [Ascii],
	Count(*) as [Count]
from @Numbers
where N <= Len(@text)
group by SubString(@text, N, 1)

tally5

Podział tekstu na wyrazy

Zapytanie zwraca wszystkie fragmenty danego tekstu rozdzielone określonym znakiem:

declare @text varchar(100) = 'to jest przykładowy tekst'
declare @char char(1) = ' '

set @text = @char + @text + @char

select SubString(@text, N + 1,
        CharIndex(@char, @text, N + 1) - N - 1) as [Words]
from @Numbers
where SubString(@text, N, 1) = @char and N < Len(@text)

tally6

Reklamy

Posted on 2013-05-09, in SQL Server and tagged , , , . Bookmark the permalink. Dodaj komentarz.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s

%d blogerów lubi to: