我将如何构建一个查询,该查询将返回在数字字符串之前或之后具有“空白空格”的所有材料编号?我们直接从SSMS导出到excel,我们在电子表格中看到了问题。如果我可以返回带有空格的所有材料编号..我可以进入并编辑它们或在导出之前进行替换以解决此问题! (mtrl
号码是通过用户上传excel模板的Windows应用程序导入的。此模板包含所有这些数据,有时它们放在材料编号中或之后的空格中)。我们曾经使用过的查询,但现在它没有返回任何内容,但是在导出时我们会识别出您在屏幕截图中突出显示的这些问题(左侧屏幕截图),然后查询以查找表中的mtrl
#(右侧屏幕截图) )。事实上,它在1之前有一个空间。
目前我们使用的查询如下:
SELECT Mtrl
FROM dbo.Source
WHERE Mtrl LIKE '% %'
答案 0 :(得分:1)
由于您是从查询中获取数据,因此您应该使用LTRIM
和RTRIM
删除任何可能的空格:
LTRIM(RTRIM([MTRL]))
请注意,这两个命令只删除 空格,而不删除标签或返回或其他空白字符。
执行上述操作将确保整个数据集的数据正常,无论您是否找到它和/或进行修复。
或者,既然您要从结果网格中复制并粘贴到Excel中,您只需CONVERT
该值就可以自然地删除任何空格:
SELECT CONVERT(INT, ' 12 ');
返回:
12
所以你只需要使用:
CONVERT(INT, [MRTL])
现在,如果你想找到任何不是数字的数据,你可以使用:
SELECT Mtrl
FROM dbo.Source
WHERE [Mtrl] LIKE '%[^0-9]%'; -- any single non-digit character
如果问题出在非空格空格字符上,您可以通过以下方法找出它们是哪些(要在开头而不是在结尾处找到它们,请将RIGHT
更改为{ {1}}):
LEFT
你可以使用以下方法一次性修复,删除常规空格(通过;WITH cte AS
(
SELECT UNICODE(RIGHT([MTRL], 1)) AS [CharVal]
FROM dbo.Source
)
SELECT *
FROM cte
WHERE cte.[CharVal] NOT BETWEEN 48 AND 57 -- digits 0 - 9
AND cte.[CharVal] <> 32; -- space
/ LTRIM
获取char 32),制表符(char 9)和不间断空格(char 160) :
RTRIM
这里我使用了相同的WHERE条件,因为如果没有任何空格,那么如果你检查两端或者根本没有任何关系(也许更快的是有一个LIKE而不是两个)。