2017-11-20 4 views
1

Ich bin nicht besonders gut im Umgang mit Datenbanken, aber gibt es eine Möglichkeit, binäre Daten als eine Art von Basis 2 Strings darzustellen? Ich benutze TSQL. Was immer ich auch mache, ich bekomme binäre Werte, die bestenfalls als 16 Strings dargestellt werden. Zum Beispiel habe ich, sagen wir, 500 in einer Zelle und ich möchte es als '0b111110100' anstatt '0x01F4' angezeigt/behandelt werden. DieseKonvertiere Base 16 Strings zu Base 2 Strings in Tsql

CONVERT(VARCHAR, cast(500 as binary(2)), 1) 

gibt 0x01F4 während ich 111110100 oder dergleichen erhalten möchten.

Ich habe keine geeigneten integrierten Funktionen gefunden. Jedoch stieß ich auf eine schreckliche und recht komplizierte Prozedur, um Basis 16 Saiten in Basis 2 Saiten umzuwandeln. Auch könnte ich darüber nachdenken, verschachtelte replace() Aufrufe auf die Werte zu verwenden, F durch 1111 usw. zu ersetzen, aber es fühlt sich nicht richtig an.

Der ganze Zweck ist es, Werte mit mindestens 4 1 s in einer Reihe in ihrer Binärdarstellung zu finden. Mein Ansatz: Wenn ich sie wie '0b111110100' aussehen lassen könnte, wäre es so einfach wie LIKE %1111%. Oder mache ich es falsch?

+1

Sehen Sie, ob dies hilft. Diese Funktion wird in eine binäre Zeichenfolge konvertiert, dann können Sie nach dem suchen, was Sie wollen. http://dpatrickcaldwell.blogspot.com/2009/05/converting-decimal-to-hexadecimal-with.html –

+0

danke! Ich werde es mir ansehen. Diese Funktion wirkt weniger einschüchternd als die, auf die ich früher gestoßen bin. – curveball

+1

Sie können sich auch auf dieses beziehen es ist bereits gefragt und beantwortet Ich hoffe, es hilft Ihnen: [sql-convert-number-to-string-Darstellung-von-jeder-Base-binär-hexadezimal] (https://stackoverflow.com/questions/33092823/sql-convert-number-to-string-Darstellung von Any-Base-Binär-Hexadezimal – Azizi

Antwort

0

Wenn man bedenkt, mein ursprüngliches Ziel:

Der ganze Zweck ist in ihrer binären Darstellung in einer Reihe mit mindestens 4 1s Werte zu finden.

nahm ich einen anderen Weg (ohne vorgeschlagen Funktionen) und mit dieser Lösung kommen könnte - erstens habe ich Rekursion über Common Table Expressions wie dies die binäre Darstellung der benötigten Werte zu erhalten: gab

with cte as(
    select 1 code, 29/2 n, 29 - 2*(29/2) bit_val 
    union all 
    select code, n/2, n - 2*(n/2) from cte 
    where n > 0 
) 
select code, row_number() over(partition by code order by n desc) 
bit_no, bit_val from cte 

die me die binäre Darstellung von 29 (zum Beispiel):

-- code is an id of entity where the value I am trying to convert into binary belongs to 
--------------------------- 
| code | bit_no | bit_val | 
--------------------------- 
| 12 | 1 | 1 | 
| 12 | 2 | 0 | 
| 12 | 3 | 1 | 
| 12 | 4 | 1 | 
| 12 | 5 | 1 | 
--------------------------- 

Dann habe ich nur eine Aggregatfunktion (SUM) in einem 4-Zeilen-Fenstern verwendet:

select *, sum(bit_val) over(partition by code order by bit_no 
rows between current row and 3 following) bits_in_a_row from cte1 

------------------------------------------- 
| code | bit_no | bit_val | bits_in_a_row | 
------------------------------------------- 
| 12 | 1 | 1 |  3  | 
| 12 | 2 | 0 |  3  | 
| 12 | 3 | 1 |  3  | 
| 12 | 4 | 1 |  2  | 
| 12 | 5 | 1 |  1  | 
------------------------------------------- 

Wenn die Summe der Zellen in 4 aufeinanderfolgenden Zeilen 4 ist - ich bekam, was ich suchte, obwohl es nicht eine Umwandlung von Base 16 Saiten zu Base 2 Saiten ist, wie ich es zuerst in der Beschriftung setzte. Die endgültige Antwort kann nur unter Verwendung von Identitäten erzielt werden, wobei bits_in_a_row gleich 4 (oder was auch immer) ist.