SQL Server Convertir entier en une chaîne binaire
Je me demandais si il y avait un moyen facile de SQL pour convertir un nombre entier en sa représentation binaire, puis l'enregistrer dans un varchar.
Par exemple 5 serait converti en "101" et stocké dans un varchar.
- Que voulez-vous de -5? "-101" ou "11111111111111111111111111111100"?
Vous devez vous connecter pour publier un commentaire.
Suivantes pourraient être codées dans une fonction. Vous devez couper les zéros non significatifs pour répondre aux exigences de votre question.
En fait c'est VRAIMENT SIMPLE à l'aide de la plaine de vieux SQL. Utilisez simplement au niveau du bit Padn. J'ai été un peu étonné qu'il n'y avait pas une solution simple mise en ligne (qui ne sont pas concernés Udf). Dans mon cas, j'ai vraiment voulu vérifier si les bits ont été ou désactiver (les données proviennent de dotnet eNums).
En conséquence voici un exemple qui va vous donner séparément et ensemble bits de valeurs et d'une chaîne binaire (le grand union est juste un hacky façon de produire les numéros qui vont travailler à travers DBs:
Donne ce résultat:
c'est un générique de base convertisseur de
http://dpatrickcaldwell.blogspot.com/2009/05/converting-decimal-to-hexadecimal-with.html
vous pouvez faire
Voici un peu d'une modification de la accepté de répondre à de Sean, depuis que j'ai découvert il limiter uniquement à permettre une codé en dur nombre de chiffres dans la sortie. Dans mon utilisation quotidienne, je trouve qu'il est plus utile d'obtenir soit seulement jusqu'à plus de 1 chiffre, ou spécifier le nombre de chiffres que j'attends en retour. Il sera automatiquement pad le côté avec des 0, de sorte qu'il s'aligne à 8, 16, ou quel que soit le nombre de bits que vous souhaitez.
J'ai utilisé le suivant ITVF fonction pour convertir un nombre décimal en Binaire
comme c'est une fonction inline, vous n'avez pas besoin de "s'inquiéter" sur de multiples lectures réalisées par l'optimiseur.
Je crois que cette méthode simplifie beaucoup d'autres idées que d'autres ont présenté. Il utilise bit à bit de l'arithmétique avec les
FOR XML
truc avec une expression de table commune pour générer les chiffres binaires.Standard SQL (testé dans PostgreSQL).
Sur SQL Server, vous pouvez essayer quelque chose comme l'exemple ci-dessous:
Je sais que je suis un peu en retard pour le jeu ici, mais j'ai récemment est venu avec une nappe de solution qui s'appuie sur le dépouillement de la table (similaire à @hkravitz solution ci-dessus.) La différence essentielle est que mon tire parti de ce que j'appelle la Index Virtuel de trier les résultats par ordre décroissant sans un opérateur de tri dans le plan d'exécution. Je accomplir cela en utilisant
dbo.rangeAB
qui est inclus à la fin de ce post.Noter que ceci renvoie les nombres de 0 à 30 (en tant que "RN" pour RowNumber) dans l'ordre croissant:
Il le fait sans tri. RN peut être définie comme la fonction ROW_NUMBER() OVER (ORDER BY (SELECT NULL)). Tri par RN ne nécessite pas une sorte, de nouveau - c'est la index virtuel à jouer.
Quand j'essaie un tri décroissant cependant, je ne obtenir une sorte dans le plan d'exécution.
Entrer Finis Opposés. RangeAB comprend une colonne nommée Op - OP IA Finis Opposite Nombre. Par "fini d'en face", je veux dire, 0 est à l'opposé de 30, 1 est l'inverse de 29, etc.. à la différence traditionnelle en face des numéros (-1 est l'inverse de 1). Finis les opposés sont retournés dans l'ordre décroissant.
Retourne:
Je peux utiliser l'Op je peux tirer RN limitées en face pour obtenir les nombres dans l'ordre décroissant, tout en exploitant toujours les index virtuel pour éviter un tri. Ces deux requêtes de la même chose, mais, lorsque l'on compare les plans d'exécution, selon SSMS retrait de la sorte réduit le coût d'une requête par un facteur de 50X.
LA FONCTION
RangeAB
Comment à ce sujet...