2016-06-28 1 views
0

Désolé si cela est une question fondamentale, mais j'ai été incapable de trouver une réponse sur Google etc.TSQL - Joindre deux champs numériques, mais avec différentes longueurs

J'ai deux tables Table1, Table2

Tableau 1 a un champ 'AccountNo' qui est un champ numérique de 10 caractères (exemple: 1122334455)

Le tableau 2 présente un champ 'SUBACCNO' qui est un champ numérique de 12 caractères (exemple: 112.233.445.501)

Comme vous pouvez voir SUBACCNO est le même que ACCOUNTNO mais avec un ajout deux chiffres à la fin du 01-99.

Si je veux joindre les deux tables et ont essayé quelque chose comme ceci:

SELECT * 
FROM TABLE1 
JOIN TABLE2 
ON TABLE1.ACCOUNTNO = TABLE2.SUBACCNO 
WHERE STR(SUBACCNO) LIKE '1122334455%%' 

En tant que joker ne peut être effectuée sur des données numériques que j'ai essayé de le convertir en une chaîne avec un caractère générique pour la dernière deux caractères. Cependant cela ne retourne rien.

Quelqu'un peut-il offrir des conseils? Merci!

+0

Les 2 derniers chiffres de SUBACCNO ne devraient-ils pas être utilisés à des fins de comparaison? –

Répondre

3

Que diriez-vous de rejoindre la colonne SUBACCNO divisé par 100:

SELECT * 
FROM TABLE1 
JOIN TABLE2 
    ON TABLE1.ACCOUNTNO = TABLE2.SUBACCNO/100 

En fait, pour être sûr que vous pourriez vouloir tronquer explicitement le quotient à la zeroth décimale en utilisant ROUND():

SELECT * 
FROM TABLE1 
JOIN TABLE2 
    ON ROUND(TABLE1.ACCOUNTNO, 0, 1) = ROUND(TABLE2.SUBACCNO/100, 0, 1) 
+1

L'arrondi semblait faire l'affaire. Merci pour la solution. – bs3ac

0

Votre jointure ne fonctionnera pas ..

Essayez ceci, ce qui n'est pas Sargable..si vous ne pouvez pas changer votre conception

SELECT * 
FROM TABLE1 
JOIN TABLE2 
ON TABLE1.ACCOUNTNO = cast(substring(TABLE2.SUBACCNO,1,10) as bigint) 

vous pouvez également ajouter une colonne plus calculée comme ci-dessous et l'indice pour une bonne performance que je recommande si vous utilisez ce type de requêtes beaucoup

create table yourtable 
(
accno bigint, 
accno1 as cast(substring(accno,1,10) as bigint) persisted 
) 

Maintenant, vous pouvez indexer ci-dessus colonne pour une bonne performance