【问题标题】:Query for blank white space before AND after a number string在数字字符串之前和之后查询空格
【发布时间】:2015-03-22 23:13:44
【问题描述】:

我将如何构建一个查询,该查询将返回在数字字符串之前或之后具有“空白空格”的所有材料编号?我们直接从 SSMS 导出到 excel,我们在电子表格中看到了问题。如果我可以返回所有带有空格的材料编号.. 我可以进去编辑它们或在导出之前进行替换以解决此问题! (mtrl 数字是通过 Windows 应用程序导入的,用户将 Excel 模板上传到该应用程序。该模板包含所有这些数据,有时它们放置在材料编号内部或之后的空格中)。我们曾经使用过的查询,但现在它不返回任何内容,但在导出时,我们识别出您在屏幕截图(左屏幕截图)中突出显示的这些问题,然后查询以在表中找到 mtrl #(右屏幕截图)。确实,它在 1 之前有一个空格。

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

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

【问题讨论】:

  • 能否设置SSMS返回“Results as text”(我认为是选项的名称)并在上面粘贴一个有代表性的文本表?
  • 另外,我知道您想要修复错误数据,但您也可以SELECT TRIM(Mtrl) AS Mtrl 来删除其中的所有空格。

标签: sql sql-server sql-server-2012 whitespace removing-whitespace


【解决方案1】:

由于您从查询中获取数据,您应该让该查询使用LTRIMRTRIM 删除任何潜在的空格:

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 更改为 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

您可以使用以下内容一次性修复,删除常规空格(char 32 via LTRIM/RTRIM)、制表符(char 9)和不间断空格(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 条件,因为如果不能有任何空格,那么您是否检查两端或是否有任何空格都没有关系(也许使用单个 LIKE 会更快两个)。

【讨论】:

  • 非常感谢您的帮助。出于某种原因,我知道这应该可以,但 TRIM 不会在返回时对其进行修剪。我有一些修补工作要做以找出原因。
  • @user3896424 尝试使用 CONVERT 而不是 LTRIM/RTRIM 组合。如果出错,那么它们不是空格,而是其他类型的空格。
  • Msg 245, Level 16, State 1, Line 2 将 varchar 值“101333457”转换为数据类型 int 时转换失败。
  • 对不起.. 我不是 SQL 大师。我从离开公司的人那里继承了这项职责。我们在这里和那里遇到了许多奇怪的错误。
  • 非常感谢您的帮助。到目前为止,这是可行的,我正在运行查询!非常感谢您的帮助!
猜你喜欢
  • 2019-10-13
  • 1970-01-01
  • 2012-02-10
  • 2023-02-24
  • 2015-09-03
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多