Pokazywanie postów oznaczonych etykietą sql. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą sql. Pokaż wszystkie posty

2015-01-14

Doctrine i Symfony - wyświetlenie SQL'a z parametrami

Wyświetlić utworzonego SQL'a możemy za pomocą polecenia:
$qb->getQuery()->getSQL();

a parametry tegoż zapytania za pomocą polecenia:
$qb->getParameters();

Wcześniej oczywiście tworzymy obiekt $qb oraz zapytanie - np:
$qb = $this->createQueryBuilder('l')
 ->where('l.del = :del')
 ->andWhere('l.wysw = :wysw')
 ->andWhere('lower(l.nazwisko) LIKE lower(:szukana) OR lower(l.nrpwz) LIKE lower(:szukana)')
 ->orderBy('l.nazwisko')
 ->setParameters(array(
  'del' => 'false',
  'wysw' => 'true',
  'szukana' => '%' . $szukana . '%'
 ));

Wynik zapytania pobieramy w poniższy sposób:
$qb->getQuery()->getResult();

2014-04-08

[pgsql] Zmiana typu kolumny na potrzeby sortowania

Załóżmy, że mamy tabelę z kolumną typu varchar, w której są kody (np. 14.5). Jeśli chcielibyśmy posortować dane za pomocą order by:

SELECT kod FROM tabela ORDER BY kod;

to otrzymalibyśmy je w kolejności:
0.1
0.16
0.3
10.11
10.4
10.6
10.8
11.11
11.4
1.16
11.6
1.2
12.11
12.4
(...)

Jeśli chcielibyśmy posortować kolumnę wg wielkości liczby to musimy rzutować kolumnę na numeric. Zapytanie wyglądać powinno zatem w ten sposób:

SELECT kod FROM tabela ORDER BY kod::numeric;

dzięki temu otrzymamy wynik:
0.1
0.16
0.3
1.16
1.2
2.17
2.4
2.5
3.4
3.9
4.10
4.4
5.8
6.10
6.16
6.4
(...)

2014-02-27

[pgsql] Funkcja replace() - zmiana treści

Kiedyś pisałem już o postgresowej funkcji replace(). Ostatnio przydała mi się ona ponownie i postanowiłem po raz kolejny o niej wspomnieć. Wykorzystałem ją do zmiany nazwy ulicy - zdarzyło mi się, że adresy niektórych użytkowników posiadały (zamiast polskich znaków) niezrozumiałe znaki (spowodowane to było przenoszeniem danych między różnymi systemami na przestrzeni wielu lat).
Poniżej przedstawiam sposób wykorzystania funkcji replace() na małym przykładzie, w którym zmieniamy w tabeli user w kolumnie ulica znaki "¦" na "Ś":

UPDATE user SET ulica=replace(ulica, '¦', 'Ś') WHERE ulica like '%¦%';

Powyższe zapytanie zaktualizuje wszystkie wpisy w tabeli user, które mają w polu ulica znak "¦" na "Ś". Warto przed odpaleniem takiego zapytania najpierw sprawdzić co tak naprawdę zwraca funkcja i ile rekordów zostanie zmienionych. Poniższe zapytanie da nam taką odpowiedź:

SELECT id, ulica, replace(ulica, '¦', 'Ś') FROM user WHERE ulica like '%¦%';

źródło: http://www.postgresql.org/docs/9.1/static/functions-string.html

2013-03-15

[psql] Import danych w formacie csv do tabeli w bazie danych

Istnieje możliwość szybkiego importu danych z pliku CSV bezpośrednio do tabeli w bazie danych. Poniżej przedstawiam prosty przykład jak tego dokonać:
drop table tabela_testowa;
create table tabela_testowa(
kod VARCHAR(10),
akronim VARCHAR(32),
nazw VARCHAR(128)
);
copy tabela_testowa (kod,akronim,nazw) from stdin with csv delimiter as ';' quote '"';
"0101";"KŘBENHAVNS";"KŘBENHAVNS KOMMUNE"
"AD76";"DSA";"DANSKE SUNDHEDSORGANISATIONERS ARBEJDSLŘSHEDSKASSE"
\.
Warto zwrócić uwagę na delimiter i quote. Więcej informacji na temat kopiowania można znaleźć w dokumentacji PostgreSQL'a. :)

2013-01-10

[psql] Wyciągnięcie id z inserta i wykorzystanie go w innym insercie

Tym razem problem SQL'owy. Miałem dziś potrzebę stworzenia zapytania, które rozpisze dane z pewnej tabeli do dwóch powiązanych ze sobą tabel. Potrzebowałem w tym celu id zapisywanej pozycji aby móc ją wykorzystać w innym insercie. Tutaj z pomocą przyszła mi możliwość utworzenia w PostgreSQL funkcji oraz triggerów. Jako pierwsze stworzyłem funkcję insert_po_insercie() za pomocą której dokonuję operacji na tej drugiej tabeli (posiadając już id):
create function insert_po_insercie()
  returns trigger
as $$
begin
  insert into table_02 (ido, idm, komentarz, idp, idupr, iddest) values ('0', '0', 'testowy komentarz', new.idp, (select id from upr where kod='ewus'), new.id);
  return new;
end;
$$ language plpgsql;
Później stworzyłem triggera insert_po_insercie, który wygląda tak:
create trigger insert_po_insercie
  after insert on table_01
for each row
execute procedure insert_po_insercie();
Widać tutaj, że po insercie do tabeli table_01 wywoływana jest funkcja insert_po_insercie(). Mając już tak funkcję i triggera można wykonać inserty do tabeli table_01:
INSERT INTO table_01 (id_operacji, data_czas_operacji, idp) SELECT id_operacji, data_czas_operacji, idp FROM guilty_table;
W funkcji przy tworzeniu inserta skorzystałem z świeżo utworzonego id (new.id) oraz przy okazji idp (new.idp), które również było mi potrzebne. Można w ten sposób pobierać dowolną kolumnę z tabeli źródłowej. Funkcja poza pokazanym na przykładzie insertem może robić wiele innych czynności. Na przykład po insercie można umieścić update do jeszcze innej tabeli, w której z kolei skorzystamy z id nowoutowrzonego inserta:
create function insert_po_insercie()
  returns trigger
as $$
begin
  insert into table_02 (ido, idm, komentarz, idp, idupr, iddest) values ('0', '0', 'testowy komentarz', new.idp, (select id from upr where kod='ewus'), new.id);
  update table_03 set idx=currval('table_02_id_seq'::regclass) where id=new.id;
  return new;
end;
$$ language plpgsql;
Całość wygląda zatem tak:
create function insert_po_insercie()
  returns trigger
as $$
begin
  insert into table_02 (ido, idm, komentarz, idp, idupr, iddest) values ('0', '0', 'testowy komentarz', new.idp, (select id from upr where kod='ewus'), new.id);
  update table_03 set idx=currval('table_02_id_seq'::regclass) where id=new.id;
  return new;
end;
$$ language plpgsql;

create trigger insert_po_insercie
  after insert on table_01
for each row
execute procedure insert_po_insercie();

INSERT INTO table_01 (id_operacji, data_czas_operacji, idp) SELECT id_operacji, data_czas_operacji, idp FROM guilty_table;
Pozdrawiam!

2010-12-08

[psql] Prosta funkcja w PostgreSQLu

PostgreSQL umożliwia tworzenie funkcji - poniżej można zobaczyć na prostym przykładzie jak tego dokonać:

CREATE OR REPLACE FUNCTION prosta_funkcja(pierwsza_zmienna integer, druga_zmienna integer) RETURNS void AS
$$
BEGIN
INSERT INTO jakas_tabela (dodata, modata, idoper, kod, nazw) SELECT now() as dodata, now() as modata, $2 as idoper, kod, nazw FROM jakas_tabela WHERE idoper=$1;
END;
$$ LANGUAGE plpgsql;

To taki zupełnie prosty przykład - więcej można znaleźć w dokumentacji.
Szczegóły funkcji można w każdej chwili sobie obejrzeć za pomocą komendy

\dt prosta_funkcja

2010-07-22

[psql] Obliczanie wieku funkcją age() i date_part()

Funkcja age() w Postgresie to bardzo fajna sprawa. Za pomocą niej można w prosty sposób obliczyć wiek użytkownika.
Zapytanie:

SELECT age(data_ur) as wiek FROM user WHERE id=1;

(gdzie data_ur jest typu date) może dać wynik:

wiek
-------------------------
6 years 11 mons 21 days

Jeśli chcielibyśmy się dowiedzieć ile użytkownik miał lat na przykład 21 kwietnia 2009 roku wystarczy napisać:

SELECT age(timestamp '2009-04-21', data_ur) as wiek FROM user WHERE id=1;

co da wynik w postaci:

wiek
------------------------
5 years 8 mons 20 days

Za pomocą funkcji date_part() można w prosty sposób "wyciągnąć" z wyniku np. jedynie ilość lat (bez informacji o miesiącach i dniach):

SELECT date_part('year', age(timestamp '2009-04-21', data_ur)) as wiek FROM user WHERE id=1

wynik:

wiek
------
5

2010-01-25

[psql] CASE WHEN END

Wyrażenie CASE w Postgresie działa i na pewno można je zastosować na wiele sposobów - mi się dziś przydało przy łączeniu dwóch kolumn.

2010-01-19

[psql] Insert z select'em w środku

Istnieje możliwość wrzucenia zawartości tego co otrzymaliśmy z SELECT'a bezpośrednio do tabeli za pomocą INSERT'a pisząc:

INSERT INTO moja_tabela (data_dodania, oper_id, poz_id, kodpozycji_id, ilosc) SELECT now() as data_dodania, '0' as oper_id, poz_id, kodpozycji_id, ilosc FROM moja_tabela WHERE poz_id=7 and ilosc=0;

Za pomocą takiej konstrukcji możliwe jest kopiowanie danych. Należy tylko pamiętać aby pola miały taki sam typ (int, date, timestamp itp.).

2010-01-13

[psql] Grupowanie i funkcja min()

Funkcja min() PostgreSQL'a w połączniu z grupowaniem daje bardzo fajną użyteczność.
Załóżmy, że mamy trzy tabele: ojciec, dziecko i powiazanie. Jeden rodzic może mieć wiele dzieci: