Nov 24 2011

MSSQL – dupliciranje tablice

Problem:

Trebamo duplicirati neku tablicu zajedno s podacima, npr. radi backupa i sl.

 

Rješenje:

SELECT * INTO tbl_backup FROM tbl_tablica

Ovo kopira strukturu i podatke. Na žalost morat ćemo ručno podesiti defaultne vrijednosti, primary i sl., ali data type polja i podatke uredno kopira.

Ako želimo samo strukturu bez podataka onda ide npr.

SELECT TOP 0 * INTO tbl_backup FROM tbl_tablica

 

 


Nov 23 2011

Cannot insert explicit value for identity column in table ‘tbl_x’ when IDENTITY_INSERT is set to OFF

Problem:

SQL error kod inserta u polje koje je označeno kao identity

Cannot insert explicit value for identity column in table ‘tbl_x’ when IDENTITY_INSERT is set to OFF

 

Rješenje:

SET IDENTITY_INSERT tbl_x ON

 

 


Oct 29 2011

MSSQL samo date iz datetime

Problem:

U bazi imamo polje datetime, a na ispisu nam treba samo datum

Rješenje:

SELECT convert(varchar(10),mojDatetime,104) as samoDatum

rezultat: 29.10.2011

U kojem će formatu izaći datum ovisi o zadnjem parametru (ovdje 104). Više o formatima ovdje:

http://linesofcode.net/snippets/45

http://msdn.microsoft.com/en-us/library/ms187928.aspx

Međutim, što ako nam datum ne treba na ispisu (u gornjem primjeru dobijemo datum kao varchar) nego za računanje. Tada može pomoći:

SELECT CAST(FLOOR( CAST( mojDatetime AS FLOAT ) )AS DATETIME) as samoDatum 

MSSQL – samo datum iz datetime 2

mojDatetime

Oct 15 2011

MSSQL vs MYSQL GROUP BY

Problem:

Kod MySql-a koristeći GROUP BY funkciju možemo selektirati neka dodatna polja uz ono polje po kojem grupiramo.

npr.


SELECT  ime, prezime, grad FROM tbl_adresar GROUP BY grad

Dobit ćemo rezultate grupirane po polju grad, ali i jedno od imena i prezimena koje stoje uz neki od tih rezultata.

Ako isto pokušamo napraviti u MSSQL dobit ćemo ovakav error:


Column 'tbl_adresar.ime' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Ako bi query preradili na gore sugerirani način:


SELECT  ime, prezime, grad FROM tbl_adresar GROUP BY grad, ime, prezime

Nebi dobili grešku, ali ni rezultat kakav očekujemo jer nas ne zanima grupiranje po imenu nego samo po gradu.

Rješenje:

Upotreba neke od MSSQL aggregate funkcije kod polja koja nisu grupirana.

min() bi možda moglo biti dobro rješenje.


SELECT  min(ime), min( prezime),  grad FROM tbl_adresar GROUP BY grad

Rezultat je sličan rezultatu dobivenom kod MySQL-a.

Grupirano po gradu, ali ispisuje i jedno ime i prezime koje u navedenu grupu pripada.

 


Oct 14 2011

MSSQL – traženje i brisanje duplikata

Problem:

Treba naći podatke u bazi koji se pojavljuju više od jednom. Dakle u pitanju je rješavanje duplića.

Rješenje:


SELECT ime,
 COUNT(ime) AS BrojPojavljivanja
FROM tbl_tablica
GROUP BY ime
HAVING ( COUNT(ime) > 1 )
ORDER BY BrojPojavljivanja DESC

Ok.. s time smo riješili traženje duplikata… ali kako ih maknuti, a da pri tome ne dobijemo probavne probleme?!
Gore navedeni query nam je rekao koji je podatak u pitanju i koliko ima istih, s time da je i onaj prvi koji nam treba u tom broju…

Slijedi jedan malo “seljačkiji” query ali nekako najpraktičniji za rješavanje ovih problema u kućnoj radinosti

SELECT * FROM tbl_tablica WHERE
 id > (
 SELECT min(id)
 FROM tbl_tablica x
 WHERE x.ime = tbl_tablica.ime
)

Ovim queryjem smo selektirali podatke samo onih redova koji su nam višak. Unutar queryja se ne nalazi ono jedno pojavljivanje koje nam treba nego samo duplikati tog jednog koji su nam višak.

Brisanje?

DELETE FROM tbl_tablica WHERE
 id > (
 SELECT min(id)
 FROM tbl_tablica x
 WHERE x.ime = tbl_tablica.ime
)

:)


Jun 14 2011

Random selekcija i SQL

Problem:

Selektirati podatke iz tablice i poredati ih nasumično.

Rješenje:

MySQL

ako želimo samo jedan podatak ali svaki put neki drugi
SELECT polje FROM tablica ORDER BY RAND() LIMIT 1

ako želimo sve podatke prema nasumičnom poretku

SELECT polje FROM tablica ORDER BY RAND()

MSSQL

ako želimo sve podatke prema nasumičnom poretku
SELECT TOP (100) PERCENT polje FROM tablica ORDER BY NEWID()

ako želimo samo jedan podatak ali svaki put neki drugi

SELECT TOP 1 polje FROM tablica ORDER BY NEWID()

 

 


Apr 12 2011

MS SQL: Order by prema broju ako je dio stringa broj

Problem:

selektirane podatke poredati (ORDER BY) kao da su brojevi iako je samo dio vrijednosti broj

npr. recimo da se polje prema kojem želimo poredati rezultat zove “mojeMijesanoPolje”

pero2peric
pero3peric
pero1peric

treba biti:

pero1peric
pero2peric
pero3peric

Rješenje:

Iako postoji i drugih rješenja ovo mi se čini baš “šeretski”…

1. napravimo funkciju kao što to kaže dobra duša na http://bendynet.com/it/ms-sql-functions-to-parse-int-or-alpha-characters/

<code>SET ANSI_NULLS ON
 GO
 SET QUOTED_IDENTIFIER ON
 GO
 CREATE FUNCTION [dbo].[parseInt]
 (
 @string VARCHAR(8000)
 )
 RETURNS VARCHAR(8000)
 AS
 BEGIN
 DECLARE @IncorrectCharLoc SMALLINT
 SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string)
 WHILE @IncorrectCharLoc > 0
 BEGIN
 SET @string = STUFF(@string, @IncorrectCharLoc, 1, '')
 SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string)
 END
 SET @string = @string
 RETURN @string
 END</code>

2. primijenimo:

 ... ORDER BY dbo.parseInt(mojeMijesanoPolje) ASC

3. Još to nije to, zar ne!? S ovim gore samo smo izvukli broj iz stringa ali i taj broj je još uvijek string. Rješenje je CAST:

... ORDER BY CAST(dbo.parseInt(mojeMijesanoPolje) AS int) ASC

Apr 5 2011

MS SQL: “if null then zero”

Problem:

Query nam vraća null, a nama treba nula

Rješenje:

Select coalesce(fieldName,0) as broj

ili

Select (case when fieldName is null then 0 else fieldName end)) as broj

ili

Select (IsNull(fieldName,0)) as broj

Apr 5 2011

MS SQL: replace funkcija

Problem:

Potrebno je maknuti ili zamijeniti karakter (ili više njih) unutar SQL query-a

Rješenje:

SELECT REPLACE(fieldName,'x','') AS rezultat FROM tableName

Ovo daje vrijednost polja fieldName gdje je slovo x zamijenjeno ničime, tj. x je izostavljen

SELECT REPLACE(fieldName,'x','y') AS rezultat FROM tableName

Ovo daje vrijednost polja fieldName gdje je slovo x zamijenjeno slovom y