2009-10-05 7 views
0

Ceci est illustre assailli par un exemple que je pense devrait fonctionner, mais qui ne fonctionne pas:Comment sélectionner dans select où la sélection intérieure est une sous-chaîne du résultat de retour

select * from TABLE_A where KEY in (
select substr(DYNAMIC_KEY,3) from TABLE_B where DYNAMIC_KEY like '$$%' and RECORD_ID='104251893783388824'); 

Fondamentalement, l'instruction select intérieure renvoient une ensemble de résultats qui avait un préfixe '$$'. Ceci est utilisé comme une clé de recherche dans TABLE_A qui ne contient pas le préfixe '$$' dans la clé.

Si je lance manuellement l'instruction intérieure:

select substr(DYNAMIC_KEY,3) from TABLE_B where DYNAMIC_KEY like '$$%' and RECORD_ID='104251893783388824' 

Copiez le premier résultat, laissez-dire '8462928318772288542' et exécutez l'instruction select externe

select * from TABLE_A where KEY = '8462928318772288542' 

Cela fonctionne. Cependant, si je cours est une instruction select (select ...), je n'obtiens aucun résultat.

Modifier:

La base de données utilisée ici est Oracle 10g.

La colonne DYNAMIC_KEY dans TABLE_B est un VARCHAR2

La colonne KEY TABLE_A est CHAR 32

+0

Quelle base de données utilisez-vous? –

+0

La base de données utilisée ici est Oracle 10g – lsiu

Répondre

1

Votre problème résulte de la comparaison entre les types de données "char (32)" dans TABLE_A.KEY et "varchar2" dans TABLE_B.DYNAMIC_KEY. Lorsque vous exécutez la sous-requête et copiez le résultat dans la requête externe, vous comparez une colonne de type char (32) à un littéral. Lorsque vous exécutez la sous-requête et que vous copiez le résultat dans la requête externe, les valeurs contenues dans TABLE_A.KEY sont remplies par la taille définie de 32. string, que les dbms traitaient comme un char (32). Sens, il était rembourré et donc la comparaison a fonctionné.

Dans votre requête d'origine, vous pouvez remplacer "where KEY in (" par "where trim(KEY) in (", puis la requête devrait fonctionner. La fonction trim() renvoie une valeur varchar2.

+0

Merci. La commande trim sur Key (la colonne char 32) a également fonctionné. – lsiu

1
SELECT TABLE_A.* 
FROM TABLE_A a 
INNER JOIN TABLE_B b ON a.KEY = b.sbustr(DYNAMIC_KEY,3) 
WHERE b.DYNAMIC_KEY like '$$%' AND b.RECORD_ID='104251893783388824' 
+0

Je pense que si vous alias TABLE_A en tant que "a" vous devez utiliser l'alias dans la liste de sélection. Je ne sais pas si cela varie selon la base de données – Gratzy

+0

Essayé cela et corrigé l'erreur de syntaxe ci-dessus. Cela renvoie également des résultats vides. – lsiu

+0

En fait, cela m'a aidé à résoudre le problème. La différence dans le type de colonne est probablement la cause du problème (varchar2 vs char 32). Pour résoudre ce problème, j'ai utilisé la déclaration suggérée par Joel Coehoorn avec une légère modification. Remplacer a.KEY = substr (b.DYNAMIC_KEY, 3) avec a.KEY comme concat (substr (DYNAMIC_KEY, 3), '%') – lsiu

0

nécessite 3 éléments substring pas deux. Aussi je soupçonne qu'il y a une discordance entre la valeur de la clé et la valeur de la sous-chaîne.

+0

Ce n'est pas le problème car l'exécution des instructions select internes donne le résultat correct avec le préfixe $$ supprimé. – lsiu

+0

En fait, le troisième paramètre de substr() est optionnel –

0

Avez-vous éventuellement des blancs de fin que vous devez découper sur l'une ou l'autre colonne? Ou peut-être les convertir tous les deux au même type de données?

Questions connexes