Mijn vraag
Ik wil eigenlijk met een subselect een waarde teruggeven net naar gelang ik output krijg uit een where statement of niet.
Alleen SQL reageert anders net naar gelang ik een tabel erbij betrek of niet.
Mijn 1e poging is :
En die gaat gewoon goed, ik krijg daar net naar gelang ik ga spelen met 1=1 of 1=0 a of b uit precies zoals ik het hebben wil.
Ok, gaan we naar poging 2 :
Ik maak dus nu eerst even een tmp-tabel aan, dit is alleen gedaan omdat het ook optreed met fysieke tabellen, alleen dan is het zo moeilijk pseudo-code te geven.
Alleen het resultaat hiervan is dat ik enkel nog maar b terugkrijg, ik kan op geen enkele wijze nog a terugkrijgen...
Als ik gewoon de inner query uitvoer krijg ik gewoon 2 resultaten met a bovenaan, dus exact wat ik zou verwachten, als ik zeg 1=0 dan krijg ik uit de inner query 1 resultaat met enkel b, de inner query lijkt gewoon te kloppen, alleen door het erbij betrekken van een tabel heb ik opeens een ander resultaat uit mijn outer query.
Rara politiepet?
Ook als ik het expliciet sorteer met de volgende trucage krijg ik niet het goede antwoord :
Of ik mijn tussenresultaat nou ascending of descending sorteer hij blijft b teruggeven. En praktisch gezien is dit ook geen oplossing omdat ik voor mijn toepassing niet weet of a groter of kleiner dan b is.
Technisch gezien zou ik het op kunnen lossen met een functie, maar dan verlies ik mijn parallelliteit voor zover ik weet en dit ding moet verschillende waardes doen binnen een query met 20+ miljoen resultaten, dus die parallelliteit geef ik liever niet op.
Het uiteindelijke doel is om een soort tri-state te hebben :
- Als var1 en var2 gelijk zijn, dan return var3
- Als var1 en var2 ongelijk zijn, doe dan een query naar een tabel en retourneer het resultaat
- Anders (als de query geen resultaat teruggeeft) return null
Ik dacht met deze constructie 2 en 1 te vangen, maar dit werkt al niet en ik zie niet in waarom het niet werkt of hoe het ik het buiten een functie om geregeld zou krijgen.
Relevante software en hardware die ik gebruik
SQL Server 2014
Ik wil eigenlijk met een subselect een waarde teruggeven net naar gelang ik output krijg uit een where statement of niet.
Alleen SQL reageert anders net naar gelang ik een tabel erbij betrek of niet.
Mijn 1e poging is :
SQL:
1
2
3
4
5
6
| select top 1 * from ( select 'a' as test where 1=1 UNION ALL select 'b' as test ) as c |
En die gaat gewoon goed, ik krijg daar net naar gelang ik ga spelen met 1=1 of 1=0 a of b uit precies zoals ik het hebben wil.
Ok, gaan we naar poging 2 :
SQL:
1
2
3
4
5
6
7
8
9
10
| --drop table #tmp select 'c' as test into #tmp select top 1 * from ( select 'a' as test from #tmp where 1=1 UNION ALL select 'b' as test ) as c |
Ik maak dus nu eerst even een tmp-tabel aan, dit is alleen gedaan omdat het ook optreed met fysieke tabellen, alleen dan is het zo moeilijk pseudo-code te geven.
Alleen het resultaat hiervan is dat ik enkel nog maar b terugkrijg, ik kan op geen enkele wijze nog a terugkrijgen...
Als ik gewoon de inner query uitvoer krijg ik gewoon 2 resultaten met a bovenaan, dus exact wat ik zou verwachten, als ik zeg 1=0 dan krijg ik uit de inner query 1 resultaat met enkel b, de inner query lijkt gewoon te kloppen, alleen door het erbij betrekken van een tabel heb ik opeens een ander resultaat uit mijn outer query.
Rara politiepet?
Ook als ik het expliciet sorteer met de volgende trucage krijg ik niet het goede antwoord :
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
| --drop table #tmp select 'c' as test into #tmp select top 1 * from ( select TOP 100 PERCENT * from ( select 'a' as test from #tmp where 1=1 UNION ALL select 'b' as test ) as c order by test asc ) as d |
Of ik mijn tussenresultaat nou ascending of descending sorteer hij blijft b teruggeven. En praktisch gezien is dit ook geen oplossing omdat ik voor mijn toepassing niet weet of a groter of kleiner dan b is.
Technisch gezien zou ik het op kunnen lossen met een functie, maar dan verlies ik mijn parallelliteit voor zover ik weet en dit ding moet verschillende waardes doen binnen een query met 20+ miljoen resultaten, dus die parallelliteit geef ik liever niet op.
Het uiteindelijke doel is om een soort tri-state te hebben :
- Als var1 en var2 gelijk zijn, dan return var3
- Als var1 en var2 ongelijk zijn, doe dan een query naar een tabel en retourneer het resultaat
- Anders (als de query geen resultaat teruggeeft) return null
Ik dacht met deze constructie 2 en 1 te vangen, maar dit werkt al niet en ik zie niet in waarom het niet werkt of hoe het ik het buiten een functie om geregeld zou krijgen.
Relevante software en hardware die ik gebruik
SQL Server 2014
[ Voor 0% gewijzigd door RobIII op 22-04-2021 20:59 . Reden: Code tags gefixed ]