Grupowanie po stringach - PostgresSQL

0

http://sqlfiddle.com/#!15/3d03f/3

CREATE TABLE MojaTabela
	(id int, productName varchar(7), wewId int, status varchar(55))
;
	
INSERT INTO MojaTabela
	(id, productName, wewId, status)
VALUES
	(1, 'plik1', 34, 'r'),
	(2, 'plik2', 56, 'w'),
	(3, 'plik3', 34, 'r'),
    (4, 'plik4', 78, 'r'),
    (5, 'plik5', 34, 'w'),
    (6, 'plik6', 67, 'r'),
    (7, 'plik7', 23, 'r'),
    (8, 'plik8', 78, 'w')
;

SELECT
  id,
  productName,
  wewId,
  (CASE WHEN status = 'r' THEN 'Tylko do odczytu'
  ELSE 'Do odczytu i zapisu' END) AS status
FROM
  MojaTabela

Baza danych: PostgresSQL

Mam tu przykładową tabelę, w której chciałbym wykonać takie zapytanie, które zwróci mi wszystkie pliki o unikalnym 'wew_id'. W przypadku,
gdy będą dwa lub więcej plików o takim samym 'wewId' to wybierze ten o najwyższych uprawnieniach, czyli w tym przypadku , uprawnienie 'Do odczytu i zapisu' jest wyższe od 'Tylko do odczytu'.

1
SELECT DISTINCT ON(wewId)
  id,
  productName,
  wewId,
  (CASE WHEN status = 'r' THEN 'Tylko do odczytu'
  ELSE 'Do odczytu i zapisu' END) AS status
FROM
  MojaTabela
  ORDER BY wewId,status
 
1

Dzięki za odpowiedzi. Niestety wasza rozwiązania mi się nie podobają, ponieważ robicie sortowanie po aliasach, czyli w tym przypadku 'Tylko do odczytu' oraz 'Do odczytu i zapisu', a w mojej aplikacji webowej zamiast tych aliasów na sztywno będzie zmienna i wcale nie jest powiedziane, że obecny porządek alfabetyczny będzie zachowany. Czy jest opcja zrobić to inaczej, tak, żeby program wiedział, że w jest zawsze większe od r?

2

czyli co - chcesz np. żeby 3 było mniejsze od 8 ale większe od 5?

Jeśli wartości mają mieć określoną kolejność to albo trzeba je tak dobrać albo trzeba mieć dodatkową tabelę typu nazwa-pozycja(ważność)

0

Problem jest taki, że w tabeli trzymam wartości r i w, a użytkownikowi wyświetlam przyjazne komunikaty 'Tylko do odczytu', 'Do odczytu i zapisu' i chciałbym aby to sortowanie odbywało się po r i w, a nie po tym co wyświetlam użytkownikowi.

0
Mikilll napisał(a):

http://sqlfiddle.com/#!15/3d03f/3

CREATE TABLE MojaTabela
	(id int, productName varchar(7), wewId int, status varchar(55))
;
	
INSERT INTO MojaTabela
	(id, productName, wewId, status)
VALUES
	(1, 'plik1', 34, 'r'),
	(2, 'plik2', 56, 'w'),
	(3, 'plik3', 34, 'r'),
    (4, 'plik4', 78, 'r'),
    (5, 'plik5', 34, 'w'),
    (6, 'plik6', 67, 'r'),
    (7, 'plik7', 23, 'r'),
    (8, 'plik8', 78, 'w')
;

SELECT
  id,
  productName,
  wewId,
  (CASE WHEN status = 'r' THEN 'Tylko do odczytu'
  ELSE 'Do odczytu i zapisu' END) AS status
FROM
  MojaTabela

Baza danych: PostgresSQL

Mam tu przykładową tabelę, w której chciałbym wykonać takie zapytanie, które zwróci mi wszystkie pliki o unikalnym 'wew_id'. W przypadku,
gdy będą dwa lub więcej plików o takim samym 'wewId' to wybierze ten o najwyższych uprawnieniach, czyli w tym przypadku , uprawnienie 'Do odczytu i zapisu' jest wyższe od 'Tylko do odczytu'.

Chodzi Ci o coś takiego:

select id, productname,wewid, (CASE WHEN STATUS = 'r' THEN 'Tylko do odczytu'
ELSE 'Do odczytu i zapisu' END) AS STATUS_opis from mojatabela order by status;

??

1

Takie tworzenie z jednej wartości dwóch pozostałych nazwa i priorytet uprawnień aż prosi się o dodatkową tabelę, będzie nad tym większa kontrola niż zmiana ciała zapytania:

CREATE TABLE statuses
	(status varchar(55),name varchar(150),priority int)
;
insert into statuses (status,name,priority)
values
('r','Tylko do odczytu',2),
('w','Odczyt i zapis',1);

Wtedy zapytanie:

SELECT DISTINCT ON(wewId)
  id,
  productName,
  wewId,
  s.name AS STATUS
FROM
  MojaTabela t
  inner join statuses s on s.status=t.status
  ORDER BY wewId,s.priority

fiddle: http://sqlfiddle.com#!15/daf5f/2

1 użytkowników online, w tym zalogowanych: 0, gości: 1