HermanMedlem sedan maj 2001427 inlägg
Hej!
Jag har problem med att villkora på ett fält av typen nvarchar(12).
I vanliga fall skriver jag bara:
SELECT * FROM t1
WHERE t2_id = N'V'
för att få ut endast 'V', dvs. inte inkludera 'W'.
Men hur skriver man om man har en underfråga som returnerar en lista?
Skriver jag:
SELECT * FROM t1
WHERE t2_id IN
(SELECT DISTINCT id
FROM t2 INNER JOIN t3 ON t2.pid = t3.pid
WHERE t3.kod = 'ok')
så kommer både V och W (i de fallen id är V/W). Jag vill alltså att villkoret på t2_id ska göras exakt / unicode.
Databasen är SQL server 2005.
LarsGMedlem sedan dec. 200012 465 inlägg
select *
from t1
where t2_id in
(select id
from t2 join t3
on t2.pid = t3.pid
where t3.kod = 'ok'
and t2.id <> n'W')
nitro2k01Medlem sedan aug. 20037 630 inlägg
LarsG: Två kommentarer, efter vad jg hittade efter lite googlande.
- Bör inte N-prefixet anges med versalt N?
- Borde det inte gå att göra en riktig ("exakt") jämförelse genom att ange collation för sub-selecten? (Känns som ett fulhack att gå runt matchningen 'v' = 'w' med ett sådant specialfall.)
HermanMedlem sedan maj 2001427 inlägg
Tack för svaret!
Det hade fungerat om jag vetat att det gällde just bara V/W. Jag vet inte innehållet på förhand. t2.id kan innehålla V/W och det är i jämförelsen med t1.t2_id som jag måste ha en exakt matchning för att inte få tillbaka felaktiga poster.
t2.id kan som exempel innehålla:
1W
2W
1V
2W
...
och ger då underfrågan tillbaka 1V,2V så vill jag inte att huvudfrågan inkluderar 1W och 2W på grund av att villkoret i underfrågan inte sker med exaktheten som id=N'1V' ger.
Hoppas jag är tydligare nu :)
Tillägg:
Det jag vill göra är detta (vilket inte fungerear...)
SELECT * FROM t1
WHERE t2_id IN
N'(SELECT DISTINCT id
FROM t2 INNER JOIN t3 ON t2.pid = t3.pid
WHERE t3.kod = 'ok')
LarsGMedlem sedan dec. 200012 465 inlägg
select *
from t1
where cast(t2_id as binary(20)) in
(select cast(id as binary(20))
from t2 join t3
on t2.pid = t3.pid
where t3.kod = 'ok')
Alternativt så kan man, som nitro2k01 säger, använda en collation. T.ex. någon variant av english. Om man konverterar till binary så blir det också skiftlägeskänsligt :).
@notro2k01 Jo, det stämmer att det skall vara N enligt standard.
HermanMedlem sedan maj 2001427 inlägg
Jag funderar på att arbeta bort att använda W som en del av detta id. Det är nog att be om problem att göra skillnad mellan v och w - även om det går att lösa så kan det säkert ställa till det i framtiden med andra sql-frågor.
Jag testade lite med att CAST:a till varbinary, men det kan nog bli segt att ha det i en större lösning och jag vill heller inte, som du påpekar, kräva att man måste matcha skiftläge. Som bonus var jag även tvungen att CAST:a underfrågan till nvarchar innan... att ändra om fälttypen är dock praktiskt omöjligt i ett kort perspektiv. Och på sikt blir det nog till att komplettera med ett heltalsfält för matchningen.
Hua vad små saker kan ta tid i anspråk :)