我目前正在通过其他人执行的几个SQL函数进行操作,但是我得到的结果我无法解释。
分解部分如下:
SELECT
N_TYPE,
CONVERT(INT, N_TYPE)&128,
CONVERT(INT, N_TYPE)&64
FROM TBL_EXAMPLE
N_TYPE是一个十进制(10,0)字段。我返回的一些示例:
+-----------+-------------+------------+
| N_TYPE | CONVERT 128 | CONVERT 64 |
+-----------+-------------+------------+
| 0 | 0 | 0 |
| 200 | 128 | 64 |
| 136 | 128 | 0 |
| 32 | 0 | 0 |
| 536870912 | 0 | 0 |
| 72 | 0 | 64 |
+-----------+-------------+------------+
如果N_TYPE高于这些值,我认为它分别返回64或128,但这不是这种情况(如上N_TYPE = 136所示,其中不返回64)。
那么,这实际上是做什么的?
答案 0 :(得分:2)
第一部分是将import java.io.{File, PrintWriter}
var array=df.collect
val writer = new PrintWriter(new File("E:\\....\\Output.csv" ))
writer.write("AAA,AAB,AAC,AAD"+"\n")
for (i<-0 to array.length-1){
writer.write(array(i).toString.replace("[","").replace("]","")+"\n")
}
writer.close()
列转换为N_TYPE
。第二部分是使用
int
运算符,即bitwise AND operator。
因此,如果您应用&
,则如果未设置右边第7个二进制数字,则将得到0的值,如果该数字被设置为1,则将得到64的值。
答案 1 :(得分:0)
SQL Server中的与号(&
)是AND
的 按位 运算符,也是示例中使用的方式是为了确定组成整数值128
和64
的位在位置上也应与组成左侧值的位(CONVERT(INT, N_TYPE)
的结果)相匹配。 / p>
检查以下示例:
Position 8 7 6 5 4 3 2 1
Result
0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1
2 0 0 0 0 0 0 1 0
4 0 0 0 0 0 1 0 0
8 0 0 0 0 1 0 0 0
16 0 0 0 1 0 0 0 0
32 0 0 1 0 0 0 0 0
64 0 1 0 0 0 0 0 0
72 0 1 0 0 1 0 0 0
128 1 0 0 0 0 0 0 0
136 1 0 0 0 1 0 0 0
200 1 1 0 0 1 0 0 0
您将看到200 & 128
将返回(按位)10000000
,这些位都是具有1的位(AND
以此方式工作),然后转换回{{ 1}}作为128
。
另一个示例INT
将返回136 & 8
,它将转换回为00001000
。
答案 2 :(得分:0)
在您的情况下,&
是用于两个表达式之间的位操作的按位运算符。
例如
select 200&128
将被计算为
200 11001000
& 128 10000000
--------- ---------
= 128 10000000
类似地
select 31&128
将计算为
31 00011111
& 128 10000000
--------- --------
= 0 00000000
您可以详细了解按位运算符Bitwise Operators (Transact-SQL)