下划线和LEFT功能

时间:2018-08-24 22:54:25

标签: sql-server-2012

我有一列的值如下所示:

  

17_data ...

     

18_data ...

     

1801151 ...数据

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

这是为什么,如何构造我的WHERE子句以提取这些行?

1 个答案:

答案 0 :(得分:1)

当您尝试使用规则LEFT(column, 3) = '17[_]'添加“ where”时,它注定会失败。运算符“ =”执行精确比较:双方必须相等。也就是说,它将查找前三个字符(left,3)等于17[_]的行,即前五个字符,一个,七个,方括号,下划线,方括号。 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[_]%'