在一张表中,我有一列Building Height,其中包含建筑物的高度.令人讨厌的是,这些值是这样输入的,例如‘18M’、‘8M’或‘8.1M’.

理想情况下,它应该在列名中包含‘m’,在行中包含数值,但事实并非如此.我对SQL Server中的表没有管理员权限.

我需要执行一个数据质量规则,其中我需要对Building Height列执行大于或小于运算符.

我如何克服这个障碍?

表格示例:

Building Height No Storeys
8.1m 3
13m 5
7m 6
9.0m 9

要执行的数据质量规则:

  • 如果建筑高度小于11米,则楼层应小于5层

我必须查找不符合条件的行.显然,障碍是数字旁边包含mBuilding Height列.

我已经查看了substringstring_split,但由于我没有更改表的管理员权限,我实际上不能更改太多,只能进行查询.

推荐答案

2个步骤:

  1. 删除m
  2. 将结果转换为小数
SELECT 
    REPLACE([Building Height],'m','') step1,
   CAST(REPLACE([Building Height],'m','') as DECIMAL(8,2)) step2,
   [No Storeys]
FROM mytable;

请参阅:DBFIDDLE

使用STRING_SPLIT(),可以执行以下操作:

SELECT 
  m.*,
  CAST(value as DECIMAL(8,3)) as [Height in meters]
FROM mytable m
CROSS APPLY STRING_SPLIT([Building Height],'m')
WHERE value<>'';

请参阅:DBFIDDLE

Sql相关问答推荐

如何查询一个名称是根据PL/pgSQL函数结果构建的表?

使用SQL/R循环查找邻居

将SEMI JOIN、ANTI JOIN转换为非连接SQL

如何通过比较不同表中相同ID S的值来筛选ID为S的列表?

如何在联接条件不匹配时按日期获取上一条记录

有没有办法用SQL编写一条CASE语句,如果列A&>0,那么列B,列C=0

转换表中的数据

如何计算一个用户S的日常连胜?

如何在SQL Server中统计按备注分组的记录数

在SELECT中将日期格式转换为双周时段

使用SQL数据库中的现有列派生或修改几个列

如何在 golang squirrel lib 中添加 postgreSQL 的distinct on

列(值不为空)到其他有序列

每次计数器增加时通过运行总重置进行分组

在SQL中实现表格数据透视类型报表

在自引用表中使用分组和计数的SQL查询语句

SQL 按 id 运行总计并受条件限制(在窗口上)

我需要遍历权重值表并确定每个权重是否有效

面对来自以下两个代码的不同输出

当没有任何行存在时,将一个表中的行插入到另一个表中的更好方法