Portál AbcLinuxu, 21. července 2025 16:23
potreboval by som pomoct s nasledujucim:
mam tabulku:
CREATE TABLE test
(number INTEGER NOT NULL,
string VARCHAR(255) NOT NULL,
count INTEGER,
UNIQUE(number), UNIQUE(string))
a potrebujem vytvorit sql query, ktora vrati:
- 1, ak je tabulka prazdna, - number z riadka, v ktorom sa zhoduje nejaky retazec s retazcom zo stlpca string - number z riadka, v ktorom je count == 0 - max(count) + 1 inak
moj pokus:
SELECT CASE
WHEN (COUNT(*) = 0) THEN 1
WHEN (string = ?) THEN (SELECT number FROM test WHERE string = ?)
WHEN (MIN(count) = 0) THEN (SELECT number FROM test WHERE count = 0)
ELSE (MAX(number) + 1) END
FROM test
pre tabulku s hodnotami:
1 | aaa | 1
2 | bbb | 1
3 | ccc | 1
4 | ddd | 1
nefunguje spravne, ked pre retazec 'aaa' vrati 5 namiesto 1, ale pre retazec 'ddd' uz vrati spravny vysledok (4)
Dakujem za radytest
. O jakou se jedná databázi?
Můžete zkusit něco takového, ale podle databáze by se to nejspíš dalo napsat jinak a lépe:
SELECT COALESCE( CASE WHEN (COUNT(t1.*) = 0) THEN 1 ELSE NULL END, CASE WHEN (COUNT(t2.*) > 0) THEN t2.number ELSE NULL END, CASE WHEN (COUNT(t3.*) > 0) THEN t3.number ELSE NULL END, SELECT MAX(number) FROM test ) FROM test t1, test t2, test t3 WHERE t2.string = ? AND t3.count = 0Každopádně ta vaše třetí podmínka (number z řádku, kde count == 0) může být splněna pro víc řádků.
select
coalesce( case when A.cnt = 0 then 1 end , B.num,C.num,A.cnt+1 )
from
(select count(*) as cnt from test ) as A
,(select max(number) as num from test where string = 'retez') as B
,(select max(number) as num from test where "count" = 0 ) as C
IMHO je hodně nešťastné pojmenovat pole count, protože toto jméno koliduje se jménem funkce.
BTW tak jak to popsal autor dotazu to nemůže být, protože není jasné jaké number se má vrátit, pokud je count == 0 pro vícero řádků? V mém řešení jsem zvolil to největší.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.