webForumDet fria alternativet

En till smart query

Databaser & SQL

6 svar · 534 visningar · startad av Simkisen

Medlem sedan jan. 200357 inlägg
Frågan#1

En till query, lite simplare dock.

id | text | key
------------------
1 | hejsan | null
2 | hello | 'en'
------------------

JPQL:

SELECT e.text FROM Entity e WHERE e.key = :key OR e.key IS NULL

ger båda raderna om key = 'en' (fel),
men ifall jag kör queryn för key = 'sv' så får jag bara en rad (rätt).

key = 'en' skall endast ge en rad också och i det fallet endast texten hello.

varje körning utav queryn skall endast ge en rad som svar (en text snutt). användningsområdet är default värde med möjlighet att overrida det för ens egna key.

Eftersom man bara hämtar ut en text så måste det inte vara JPQL utan vanlig native SQL funkar också men föredrar JPQL. anyway, har ni någon idé så är ni välkomna att komma med de.

Hare gött!

Medlem sedan aug. 20039 340 inlägg
#2
SELECT e.text FROM Entity e WHERE e.key = :key XOR e.key IS NULL

Edit, vid närmare eftertanke kommer inte det där funka...

Medlem sedan jan. 200357 inlägg
#3

mm, med tanke på att båda jämförelserna kan vara true så failar det tyvärr..

Medlem sedan dec. 20025 483 inlägg
#4

Jag hade kanske löst det med följande SQL:

SELECT e.text FROM Entity e WHERE e.key = key OR e.key IS NULL ORDER BY CASE WHEN e.text IS NOT NULL THEN 1 ELSE 2 END LIMIT 1
Medlem sedan aug. 20039 340 inlägg
#5

Peter, jag satt och testade med något liknande, fast utan CASE. (Jag får för övrigt inte din case-kod att funka, ens när jag ändrar END till END CASE)
ORDER BY e.key DESC verkar funka bra.

SELECT e.text FROM `test_default` e 
WHERE e.stringid = 0 AND (e.key = 'tr' OR e.key IS null)
ORDER BY e.key DESC
LIMIT 1;
Medlem sedan dec. 20025 483 inlägg
#6

Frågan är vilket DBMS ts använder, det är inte säkert att CASE existerar i den aktuella dialekten. Är det MySQL fungerar CASE och framför allt i ORDER BY.

Medlem sedan jan. 200357 inlägg
#7

MySQL med Toplink är det men är inte säker på att CASE funkar med JPQL dock, har inte hunnit testa än.

262 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)