SQL - 从 '1' s 的位置查找二进制表示

标签 sql sql-server casting binary varchar

确实很难找到一个好的标题。

问题是:我有一个 SELECT 查询 GROUP BY 一个字段,最多返回三个值 (1,2,3)。这些值代表二进制数中“1”的位置。 换句话说:

Query Output    |     Reult
0,1,2           |      7 (111)
1,2             |      6 (110)
3               |      1 (001)
-               |      0 (000)

好吧,我知道这很容易。但有两个限制。首先,我想要一个查询而不是函数/存储过程。其次,结果应该是字符串(如“010”)而不是数字。

我找到了整数值的解决方案,但没有找到字符串(varchar)

SELECT COALESCE(sum(power(2, field)), 0) AS test FROM (
  SELECT field FROM  myTable GROUP BY field) a

我正在使用 SQL Server 2008,以防万一。

我也有这个解决方案,但这个解决方案不能扩展到更多的输出:

  SELECT output = 
  CASE TEST 
    WHEN  0 THEN '000'
    WHEN  1 THEN '001'
    WHEN  2 THEN '010'
    WHEN  3 THEN '011'
    WHEN  4 THEN '100'
    WHEN  5 THEN '101'
    WHEN  6 THEN '110'
    WHEN  7 THEN '111'
  END
  FROM(
  select COALESCE(sum(power(2, 3 - field)), 0) as test from (
  select field from myTable group by field) a) b

最佳答案

您可以使用二进制and和字符串连接:

select (case when test&4 > 0 then '1' else '0' end) +
       (case when test&2 > 0 then '1' else '0' end) +
       (case when test&1 > 0 then '1' else '0' end)
from (select 6 as test) t;

如果您对 case 语句过敏,您可以这样做:

select CHAR(ascii(0) + (test&4)/4) +
       CHAR(ascii(0) + (test&2)/2) +
       CHAR(ascii(0) + (test&1)/1)
from (select 6 as test) t

关于SQL - 从 '1' s 的位置查找二进制表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17707945/

相关文章:

sql - 授予者没有 GRANT 权限 - 问题

sql - 在部署时将大量数据导入 SQL Server (Express) 数据库

android - 如何将 Cast 扩展添加到我的 Android 应用

java - Java 中的 Casting 是否有任何运行时成本?

php - 如何避免选择所有行显示相同值的列(SQL 查询)

python - 由于一个或多个映射器初始化失败,无法在 SQLAlchemy 中创建记录

sql-server - 如何在构建时忽略 .sql 文件但将其包含在架构比较中

javascript - 代码后面来自客户端的文本框值?

c++ - MFC 类和 C++ 样式转换

sql - 带日期时间的 MSSQL 转换不输出 Z 时区指示符