webForumDet fria alternativet

SQL-syntax för underfråga

5 svar · 639 visningar · startad av Herman

HermanMedlem sedan maj 2001427 inlägg
#1

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
#2
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
#3

LarsG: Två kommentarer, efter vad jg hittade efter lite googlande.

  1. Bör inte N-prefixet anges med versalt N?
  2. 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
#4

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
#5
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
#6

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 :)

Genererad på 373 ms · cache AV · v20260730165559-full.f96bc7eb