Sql server 2012 下划线和左键函数

Sql server 2012 下划线和左键函数,sql-server-2012,Sql Server 2012,我有一个列,其值如下所示: 17_数据 18_数据 1801151…数据 这些数据在这些列中不是最干净的,因此我尝试使用一个LEFT函数来标识2017年后有下划线LEFTcolumn的行,3='17[\u]'这不会返回一列。为了排除故障,我在SELECT语句中添加了WHERE子句以查看返回的内容,并得到了值175,其中实际的前三个字符是17 这是为什么?我如何构造WHERE子句来提取这些行?当您尝试使用LEFTcolumn规则3='17[\u]'添加'WHERE'时,它注定会失败。运算符“=”执

我有一个列,其值如下所示:

17_数据

18_数据

1801151…数据

这些数据在这些列中不是最干净的,因此我尝试使用一个LEFT函数来标识2017年后有下划线LEFTcolumn的行,3='17[\u]'这不会返回一列。为了排除故障,我在SELECT语句中添加了WHERE子句以查看返回的内容,并得到了值175,其中实际的前三个字符是17


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

当您尝试使用LEFTcolumn规则3='17[\u]'添加'WHERE'时,它注定会失败。运算符“=”执行精确比较:两侧必须相等。也就是说,它将查找其前3个字符(左3个)等于17[_]的行,即5个字符,1个,7个,方括号,下划线,方括号。3个字符的文本永远不会与5个字符完全匹配

你应该简单地写下:

WHERE  LEFT(column, 3) = '17_'
我猜你是从阅读类似模式的文章中得到了添加括号的想法。LIKE运算符允许您查找包含在数据开始/结束/中间的字符串

WHERE column LIKE 'mom%'    - starts with mom
WHERE column LIKE '%dad'    - ends with dad
等等。LIKE支持“%”表示任意长度的文本,也支持uu表示任意长度的文本,然后只支持一个字符。这就形成了一个问题:当你想说以“妈妈”开头时,你不能写

WHERE column LIKE '_mom%'
因为它还将匹配9mom、Bmom等,因为uu表示“任何单个字符”。这就是为什么在这种情况下,仅在LIKE中,您必须将下划线写在括号中:

WHERE column LIKE '[_]mom%'      - starts with _mom
知道了这一点,很明显你也可以用LIKE来构建你的“从17开始”:

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

试试LEFTcolumn,3='17/173',转义字符使SQL将它后面的任何内容都视为文字字符。当我将LEFTcolumn,3放入SELECT语句中时,它实际上返回175,而不是返回'17_173'。你知道为什么吗?@mschmidt你可能有很多行是以17开头的,有些可能是以17开头的,而另一些可能是以175开头的,等等。如果你写的像17,或者像17%,或者没有像col一样的。。短语,然后您将获取所有行,而不仅仅是您想要的行。确保已正确设置where筛选器。尝试以下查询:选择LEFTcol,3,col from table where col like'17%'并选择LEFTcol,3,col from table where col like'17[\u]%”。它们返回2个col,这样你就可以比较LEFT产生的结果,原始col值是多少,以及在哪里过滤它;我删除了WHERE子句中的所有内容,只有两列:列上的左函数和未更改的主列。奇怪的是,左函数返回175,而实际数据为17_15116。我试图理解为什么LEFT函数会返回175,而它应该返回17。@mschmidt:这很奇怪。如果你没有任何愚蠢而难以察觉的打印错误,我会认为它是MSQL2012中的一个bug。我不确定他们是否仍然接受该版本的错误报告。。您可以将整个查询和一些实际行粘贴到此处作为示例。。也许有人会注意到一件我们还没有讨论过的事情