May 24 2018

MSSQL – SELECT COALESCE

Problem: WHERE X = ako je dostupno A selektiraj A,  a ako nije selektiraj B ako je B dostupno, a ako nije ni B dostupno selektiraj C…


SELECT * FROM tbl_test WHERE  tbl_test.lang = (
COALESCE(
(SELECT TOP 1 lang FROM tbl_test2 WHERE  lang='mk' ),
(SELECT TOP 1 lang FROM tbl_test2 WHERE lang='en'),
'hr'
)

No što ako želimo selektirati ovako: ako je dostupno A selektiraj A,  a ako nije selektiraj B ako je B dostupno, a ako nije ni B dostupno selektiraj C ali ne u WHERE uvjetu nego u samom selectu:

SELECT
COALESCE(TBL1.partner_id,TBL2.partner_id) as partner_id,
COALESCE(TBL1.event_title,TBL2.event_title) as event_name,
COALESCE(TBL1.lang,TBL2.lang) as lang
FROM
(SELECT partner_id, lang, event_title FROM tbl_a WHERE tbl_a.lang = 'HR') AS TBL1
FULL OUTER JOIN
(SELECT tbl_a.partner_id,tbl_a.lang,tbl_a.event_title FROM tbl_a WHERE tbl_a.lang = 'EN') AS TBL2
ON TBL1.partner_id = TBL2.partner_id

Apr 5 2018

MSSQL: usporedba datuma koi je varchar sa datumom koji je datetime

Problem: u bazi je datum u polju varchar u obliku yyyy-mm-dd i zanima nas sve gdje je taj datum između danas i za 30 dana

Rješenje: varchar castati kao date. Ali i getdate() castati kao date jer getdate() vraća datetime


SELECT * FROM tablica

WHERE DatumVarchar is not null

AND CAST(DatumVarchar  as date) >= DATEADD(d, 0, DATEDIFF(d, 0,  CAST(GETDATE() as date)))

AND CAST(DatumVarchar as date) <= DATEADD(d, 30, DATEDIFF(d, 0,  CAST(GETDATE() as date)))

Mar 5 2018

MSSQL: ORDER BY the IN value list

Problem: Poredati rezultate SQL upita po nekom svojem poretku koji nema veze sa samim rezultatima sql upita.

Rješenje:

 

SELECT tbl_test.*
FROM tbl_test
INNER JOIN(
 VALUES
 (1,1),
 (3,2),
 (2,3),
 (4,4)
) AS dtbl_list (id, ordering) on tbl_test.id = dtbl_list.id
ORDER by dtbl_list.ordering

Source: https://stackoverflow.com/questions/866465/order-by-the-in-value-list


Jun 29 2017

MSSQL – bit field & group by

Problem: Potrebno je izvršiti aggregate funkciju na bit polje zbog grupiranja, a da se pritom ne grupira po bit polju

Rješenje:

Potrebno je pretvoriti bit u integer na kojeg onda možemo primijeniti aggregate funkciju


min(CAST(prikaz AS int)) AS prikaz

Jun 28 2017

MSSQL – Formatiranje datuma koji je string

Problem: Sljedeći upit daje nam lijepo formatirani datum dd.mm.yyyy kada se kao datum koristi GETDATE() funkcija


SELECT CONVERT(VARCHAR(10),GETDATE(), 104) as datum

Rezultat: 28.06.2017

Također, sljedeći upit daje nam lijepo formatirani datum dd.mm.yyyy kada se kao datum koristi datetime polje iz baze


SELECT CONVERT(VARCHAR(10),datum_novosti, 104) as datum

Rezultat: 28.06.2017

Međutim, iako je datum u bazi zapisan kao yyyy-mm-dd, sljedeći upit ne daje nam traženi format


SELECT CONVERT(VARCHAR(10),'2017-06-05', 104) as datum

Rezultat: 2017-06-05

Rješenje: Pretvoriti string u datum:


SELECT CONVERT(VARCHAR(10),cast('2017-06-05' as date), 104) as datum

Rezultat: 28.06.2017


Dec 5 2016

MSSQL – samo mjesec i godina iz datuma radi usporedbe

Problem: zanima nas usporedba dva datuma na bazi mjeseca i godine pri čemu nas ne zanima dan i vrijeme:

Rješenje:

SELECT
   DATEADD(MONTH, DATEDIFF(MONTH, 0, datum), 0) AS samo_mjesec_godina
FROM
   tbl_datumi


Rezultat je svođenje svih datuma na mjesec i godinu pri čemu i dalje imamo datume u igri ali su svi prvog u mjesecu i vrijeme je 00:00:00

2016-12-01 00:00:00

 


Aug 10 2016

MSSQL – Random i gropu by koristeći cross apply

Problem :

imamo 10 apartmana , za svaki apartman imamo po 5 slika… potrebno je selektirati po jednu random sliku za svaki od apartmana. S obzirom da group by traži agregatnu funkciju kod selekcije, korištenje Min(image_url) kod selecta će uvijek vraćati istu sliku, onu koja je Min.

 

Rješenje:


select
 MIN(A.id) AS slika_id,
 A.obj_id,
 dtbl.image_url
from
 tbl_slike A
 cross apply
 (select TOP 1 image_url, obj_id
 from tbl_slike B
 WHERE B.obj_id = A.obj_id
 order by newid()
 ) dtbl
group by A.obj_id, dtbl.image_url

Oct 21 2015

MSSQL – količina karaktera u ntext polju

Problem: zanima nas količina karaktera unutar ntext polja. npr gdje je broj karaktera manji od 5000

Rješenje:

SELECT * FROM tbl_tablica WHERE DataLength(sadrzaj)<5000


Oct 21 2015

MSSQL – replace ntext

Problem – treba napraviti replace na polju koje je ntext. Sa nvarchar nema problema i to bi bilo replace(polje,’A',’B') gdje bi svaki A bio zamijenjen sa B. Ovo, međutim ne igra ako je polje tipa ntext.

Rješenje – pretvoriti ntext u nvarchar. Jedini je problem ako je količina podataka veća od maksimalne zapremine nvarchar tipa.

CAST(REPLACE(CAST(polje as NVarchar(MAX)),'A','B') AS NText)

Mar 15 2015

MSSQL: Update INNER JOIN

Problem: Updejtati polje X tablice A vrijednošću polja Y tablice B tamo gdje je podatak W tablice A jednak podatku Z tablice B

Rješenje:


UPDATE tbl_A

SET tbl_A.w = tbl_B.z

FROM tbl_A

INNER JOIN tbl_B ON tbl_A.x = tbl_B.y

 

MySQL verzija: MySQL – UPDATE INNER JOIN