首页 > 解决方案 > 下划线和 LEFT 函数

问题描述

我有一列的值如下所示:

17_数据...

18_数据...

1801151...数据

此列中的数据不是最干净的,因此我尝试使用 LEFT 函数来识别具有 2017 年后跟下划线的行LEFT(column, 3) = '17[_]' 这不会返回单个列。因此,为了排除故障,我将这个 WHERE 子句添加到 SELECT 语句中以查看返回的内容,我得到了值 175,其中实际的前三个字符是“17_”。

为什么会这样,我如何构造我的 WHERE 子句来获取这些行?

标签: sql-server-2012

解决方案


当您尝试使用规则添加 'where' 时LEFT(column, 3) = '17[_]',它注定会失败。运算符 '=' 执行精确比较:两边必须相等。也就是说,它将查找前 3 个字符 (left,3) 等于 的行17[_],即 5 个字符,一个、七个、括号、下划线、括号。3 个字符的文本永远不会完全匹配 5 个字符。

你应该简单地写:

WHERE  LEFT(column, 3) = '17_'

我想你已经有了从阅读 LIKE 模式中添加括号的想法。LIKE 运算符允许您查找包含在数据开始/结束/中间的字符串。

WHERE column LIKE 'mom%'    - starts with mom
WHERE column LIKE '%dad'    - ends with dad

等等。LIKE 支持 '%' 表示“然后是任意长度的文本”,还支持“_”表示“然后只有一个字符”。这就形成了一个问题:当你想说“以_mom开头”时,你不能写

WHERE column LIKE '_mom%'

因为它也会匹配 9mom、Bmom 等,因为它的_意思是“任何单个字符”。这就是为什么在这种情况下,只有在 LIKE 中,您必须在括号中写下划线:

WHERE column LIKE '[_]mom%'      - starts with _mom

知道了这一点,很明显你也可以用 LIKE 构建你的“以 17_ 开头”:

SELECT column1, column2, ..., columnN
FROM sometable
WHERE column LIKE '17[_]%'

推荐阅读