【问题标题】:SQL Server 2008: How to find trailing spacesSQL Server 2008:如何查找尾随空格
【发布时间】:2011-02-02 21:21:24
【问题描述】:

如何在包含尾随空格的列中找到所有列值?对于前导空格,它只是

select col from table where substring(col,1,1) = ' ';

【问题讨论】:

    标签: sql sql-server string tsql sql-server-2008


    【解决方案1】:

    你可以用LIKE找到尾随空格:

    SELECT col FROM tbl WHERE col LIKE '% '
    

    【讨论】:

    • 我知道这是一个非常古老的帖子,但我想知道,如果我想检查我的表中是否有任何列包含尾随空格?顺便说一句,我在表中有 45 个字段...我该怎么做?
    • @10e5x 这是一个不同的问题。我建议您将其发布为另一个问题。 :-)
    • @rodrigocprates:视情况而定。一种选择是创建一个额外的 BIT 列来存储字段是否以空格结尾的计算值(触发时间?)。另一种选择是创建一个计算列来做同样的事情。或者也许是一个索引视图来做同样的事情。最后,尝试一下(可能会更糟,也可能不会)是使用子字符串来获取最后一个字符并查看它是否是空格,尽管我怀疑它会更慢。
    • 删除它:UPDATE tablename SET columnname = RTRIM(columnname)。见this answer。
    【解决方案2】:

    SQL Server 2005:

    select col from tbl where right(col, 1) = ' '
    

    作为演示:

    select 
        case when right('said Fred', 1) = ' ' then 1 else 0 end as NoTrail,
        case when right('said Fred ', 1) = ' ' then 1 else 0 end as WithTrail
    

    返回

    NoTrail WithTrail
    0       1  
    

    【讨论】:

      【解决方案3】:

      这对我有用:

      select * from table_name where column_name not like RTRIM(column_name)
      

      这将为您提供所有带有尾随空格的记录。

      如果您想获取具有前导或尾随空格的记录,那么您可以使用:

      select * from table_name where column_name not like LTRIM(RTRIM(column_name))
      

      【讨论】:

        【解决方案4】:

        一个非常简单的方法是使用 LEN 函数。 LEN 将修剪尾随空格但不会修剪前面的空格,因此如果您的 LEN() 与您的 LEN(REVERSE()) 不同,您将获得所有带有尾随空格的行:

        select col from table where LEN(col) <> LEN(REVERSE(col));
        

        这也可以用来计算你有多少空间用于更高级的逻辑。

        【讨论】:

          【解决方案5】:
          SELECT * FROM tbl WHERE LEN(col) != DATALENGTH(col)
          

          应该也可以。

          【讨论】:

          【解决方案6】:

          有几种不同的方法可以做到这一点...

          假设您的意图是删除任何前导和/或尾随空格,我最喜欢的选项是执行以下操作,这将动态创建 T-SQL 到 UPDATE 所有带有不需要空格的列到它们的修剪值:

          SELECT 
          'UPDATE [<DatabaseName>].[dbo].['+TABLE_NAME+']
          SET ['+COLUMN_NAME+']=LTRIM(RTRIM(['+COLUMN_NAME+']))
          WHERE ['+COLUMN_NAME+']=LTRIM(RTRIM(['+COLUMN_NAME+']));'+CHAR(13)
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE TABLE_NAME LIKE '<TableName>%' 
              AND DATA_TYPE!='date'
          ORDER BY TABLE_NAME,COLUMN_NAME
          

          如果您确实需要识别它们,请尝试以下查询之一:

          SELECT *
          FROM [database].[schema].[table]
          WHERE [col1]!=LTRIM(RTRIM([col1]))
          

          更动态的 SQL:

          SELECT 'SELECT ''['+TABLE_NAME+'].['+COLUMN_NAME+']'',*
          FROM [<your database name>].[dbo].['+TABLE_NAME+']
          WHERE ['+COLUMN_NAME+'] LIKE ''% ''
              OR ['+COLUMN_NAME+'] LIKE '' %'';
          GO
          '
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE TABLE_NAME LIKE '<filter table name as desired>%'
              AND DATA_TYPE!='date'
          

          【讨论】:

          • 以什么方式超越?
          • SELECT col FROM tbl WHERE col LIKE '%'
          【解决方案7】:

          这是查找带有前导或尾随空格的记录的替代方法,包括制表符等:

          SELECT * FROM tbl WHERE NOT TRIM(col) = col
          

          【讨论】:

          • SQL Server 中没有TRIM 函数,在= 比较中无论如何都会忽略尾随空格。
          • 好的,抱歉,我认为这是标准 SQL。它可以在 PostgreSQL 中按预期工作,我发现这个问题是因为我试图用 PostgreSQL 解决同样的问题,所以也许它可以帮助其他人。
          【解决方案8】:

          试试这个:

          UPDATE Battles
          SET name = CASE WHEN (LEN(name+'a')-1)>LEN(RTRIM(name))
          THEN REPLICATE(' ', (LEN(name+'a')-1)- LEN(RTRIM(name)))+RTRIM(name)
          ELSE name
          END
          

          【讨论】:

            【解决方案9】:

            SQL Server 中忽略了空格,所以对我来说,即使是前导空格也不起作用。

            select col from table where substring(col,1,1) = ' '
            

            如果只有一个空格 (' ') 或空白 ('') 将不起作用

            所以我设计了以下内容:

            select * from [table] where substring(REPLACE(col, ' ', '#'),1,1) = '#'
            

            【讨论】:

            • “SQL Server 中忽略空格...”是什么意思?也许您的意思是在子字符串函数的上下文中?
            • @SQL_Underworld 不确定 OP 是什么意思,但对于 'test' 的实际 db 值,我返回了所有 1.where test like 'test'、2.'where test like 'test '、3.@ 的行987654325@ 和 4.where test='test '。我还发现len(test) 是 4 而不是 5。所以似乎所有的 len 和 = 都忽略了尾随空格。 Thunder 建议的子字符串技巧确实用 # 替换了空格,因此可以使用 len、like 和 =。这可能是特定于编码的。
            【解决方案10】:

            这是尾随空格的另一种选择。

            DECLARE @VALUE VARCHAR(50) = NULL
            
            DECLARE @VALUE VARCHAR(50) = '  '
            
            IF ((@VALUE IS NOT NULL) AND (LTRIM(RTRIM(@VALUE)) != ''))
            
            BEGIN
               SELECT 'TRUE'
            END
            ELSE
            BEGIN
               SELECT 'FALSE'
            END
            

            【讨论】:

              【解决方案11】:

              我发现接受的答案有点慢:

              SELECT col FROM tbl WHERE col LIKE '% ';
              

              反对这种技术:

              SELECT col FROM tbl WHERE ASCII(RIGHT([value], 1)) = 32;
              

              我们的想法是获取最后一个字符,但将其ASCII 代码与ASCII 代码进行比较,而不是仅与' '(空格)进行比较。如果我们只使用 ' ' 空格,空字符串将产生 true:

              DECLARE @EmptyString NVARCHAR(12) = '';
              
              SELECT IIF(RIGHT(@EmptyString, 1) = ' ', 1, 0); -- this returns 1
              

              以上是因为微软的implementation of string comparisons。

              那么,到底有多快?

              你可以试试下面的代码:

              CREATE TABLE #DataSource 
              (
                  [RowID] INT PRIMARY KEY IDENTITY(1,1)
                 ,[value] NVARCHAR(1024)
              );
              
              INSERT INTO #DataSource ([value])
              SELECT TOP (1000000) 'text ' + CAST(ROW_NUMBER() OVER(ORDER BY t1.number) AS VARCHAR(12)) 
              FROM master..spt_values t1 
              CROSS JOIN master..spt_values t2
              
              UPDATE #DataSource
              SET [value] = [value] + ' '
              WHERE [RowID] = 100000;
              
              
              SELECT *
              FROM #DataSource
              WHERE ASCII(RIGHT([value], 1)) = 32;
              
              SELECT *
              FROM #DataSource
              WHERE [value] LIKE '% ';
              

              在我的机器上大约有 1 秒的差异:

              我已经在有 600k 行但更大的表上对其进行了测试,差异在 8 秒以上。所以,究竟有多快取决于您的真实案例数据。

              【讨论】:

                【解决方案12】:

                使用CHARINDEX 和REVERSE 实现此目的的另一种方法如下:

                select col1 from table1
                WHERE charindex(' ', reverse(col1)) = 1
                

                参见示例Here

                【讨论】:

                  【解决方案13】:

                  我们可以尝试下划线来查找空白条目,虽然不是使用'%%'或''这样的准确解决方案,但我可以找到空白条目。

                  从 col_name like '_' 的表中选择 col_name

                  【讨论】:

                  • 这将找到所有以任何字符开头的值。
                  猜你喜欢
                  • 1970-01-01
                  • 2010-12-31
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-09-29
                  相关资源
                  最近更新 更多