查询数字字符串前后的空白白色 space

Query for blank white space before AND after a number string

我将如何构建一个查询,即 return 所有 material 在数字字符串之前或之后具有 "blank white space" 的数字?我们直接从 SSMS 导出到 excel,我们在电子表格中看到了问题。如果我可以 return 所有 material 数字与 spaces.. 我可以进入并编辑它们或进行替换以在导出之前解决此问题! (mtrl 号码是通过 windows 应用程序导入的,用户将 excel 模板上传到该应用程序。该模板包含所有这些数据,有时它们会放在 space 中或 material 数字之后)。我们曾经使用的查询,但现在它没有 return 任何东西,但是在导出时,我们识别出这些问题,您在屏幕截图(左侧屏幕截图)中突出显示,然后查询以找到 mtrl # 在table(右侧截图)。事实上,它在 1 之前有一个 space。

目前我们使用的查询如下所示:

SELECT  Mtrl
FROM dbo.Source
WHERE Mtrl LIKE '% %'

由于您是从查询中获取数据,因此您应该让该查询使用 LTRIMRTRIM:

删除任何潜在的 spaces
LTRIM(RTRIM([MTRL]))

请记住,这两个命令仅删除 space,而不是制表符或 returns 或其他白色-space 字符。

做上面的事情,不管你找到没找到,都会保证整个数据集的数据没问题and/or修复

或者,由于您是从结果网格复制并粘贴到 Excel,您可以将值 CONVERT 转换为一个数字,这将自然地删除任何 spaces :

SELECT CONVERT(INT, ' 12 ');

Returns:

12

所以你只需使用:

CONVERT(INT, [MRTL])

现在,如果您想查找其中包含任何非数字的数据,您可以使用:

SELECT Mtrl
FROM   dbo.Source
WHERE  [Mtrl] LIKE '%[^0-9]%'; -- any single non-digit character

如果问题出在非space 白色-space 字符上,您可以通过以下方式找出它们是哪些(要在开头而不是末尾找到它们,将 RIGHT 更改为 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

并且您可以使用以下方法一次性修复,删除常规 spaces(通过 LTRIM/RTRIM 的字符 32)、制表符(字符 9)和非-breaking spaces (char 160):

UPDATE src
SET    src.[Mtrl] = REPLACE(
                            REPLACE(
                                    LTRIM(RTRIM(src.[Mtrl])),
                                    CHAR(160),
                                    ''),
                            CHAR(9),
                            '')
FROM   dbo.Source src
WHERE  src.[Mtrl] LIKE '%['    -- find rows with any of the following characters
                          + CHAR(9) -- tab
                          + CHAR(32) -- space
                          + CHAR(160) -- non-breaking space
                          + ']%';

这里我使用了与你相同的 WHERE 条件,因为如果没有任何 spaces 那么你检查两端或任何一个都没有关系(也许它是拥有一个 LIKE 而不是两个会更快)。