SQL查询 - 过滤掉仅包含空格的字段

时间:2014-09-16 08:12:26

标签: sql sql-server space

我需要编写一个sql查询来过滤掉字段中空格数不断变化的行。例如,我有这个查询

   SELECT MEMO_SYSTEM_TXT
   FROM [EE].[dbo].[EE_Billing_Memo]
   where MEMO_SYSTEM_TXT is not null and MEMO_SYSTEM_TXT <> '' and MEMO_SYSTEM_TXT <>  ' '

我发现字段MEMO_SYSTEM_TXT可能包含不同数量的空格,因此我的限制是不够的。任何人都有一个强大的cluase可以一次过滤所有空间?

7 个答案:

答案 0 :(得分:4)

SELECT 
      MEMO_SYSTEM_TXT
FROM [EE].[dbo].[EE_Billing_Memo]
WHERE 
        MEMO_SYSTEM_TXT IS NOT NULL 
    AND LTRIM(MEMO_SYSTEM_TXT) <> ''

答案 1 :(得分:3)

几个空格总是等于空字符串

SELECT 1
WHERE 
  'a' = 'a ' and
  'a' = 'a  ' and 
  '' = '   ' and
  cast('' as char(1)) = cast('   ' as char(5))

因为它们全部相等而返回1

所以你要做的就是:

SELECT MEMO_SYSTEM_TXT
FROM [EE].[dbo].[EE_Billing_Memo]
WHERE MEMO_SYSTEM_TXT is not null and MEMO_SYSTEM_TXT <> ''

答案 2 :(得分:1)

最简单的方法是用空字符串替换空格,并检查字符串长度,即表达你的条件:

AND LEN(REPLACE(MEMO_SYSTEM_TXT , ' ', '')) = 0

这将找到由任意数量的空格组成的所有空字符串和字符串:

'', ' ', '  ', '   '...

所以这可以取代原来的表达式:

 and MEMO_SYSTEM_TXT <> '' and MEMO_SYSTEM_TXT <> ' '

以及您必须包含的所有剩余MEMO_SYSTEM_TXT <> ' '

答案 3 :(得分:0)

这会过滤掉MEMO_SYSTEM_TXT,它们不是空字符串或空字符串,并且不包含任何空格。

SELECT MEMO_SYSTEM_TXT
FROM [EE].[dbo].[EE_Billing_Memo]
WHERE 
    MEMO_SYSTEM_TXT IS NOT NULL
    AND MEMO_SYSTEM_TXT <> ''
    AND MEMO_SYSTEM_TXT NOT LIKE '% %'

答案 4 :(得分:0)

您可以使用类似RegEx的条件,但supported functionality在本机T-SQL中非常有限。

SELECT
  MEMO_SYSTEM_TXT
FROM
  [EE].[dbo].[EE_Billing_Memo]
WHERE 
    MEMO_SYSTEM_TXT LIKE N'%[^ ]%'

示例值

SELECT
    *
FROM
    (VALUES (''), ('  '), (' '), ('x y'), (' x'), ('x ')) AS A(txt)
WHERE
    txt LIKE N'%[^ ]%'

如果这不是按时查询,请更新存储在列中的数据,更新所有记录以删除所有仅空格值(将它们更新为NULL或空字符串)。

您可以为列添加CHECK约束,以防止新创建的“空”记录。

将所有'empyt'值更新为NULL

UPDATE
  [EE].[dbo].[EE_Billing_Memo]
SET
  MEMO_SYSTEM_TXT = NULL
WHERE
  MEMO_SYSTEM_TXT LIKE N'%[^ ]%'

要添加的CHECK约束:

CONSTRAINT CK_PreventEmpty_MEMO_SYSTEM_TXT
  CHECK MEMO_SYSTEM_TXT LIKE N'%[^ ]%'

另一种解决方案是添加INSTEAD OF触发器(INSERTUPDATE)以防止MEMO_SYSTEM_TXT中的“空”值,或者您可以创建一个索引视图不包含'空'文本。

答案 5 :(得分:0)

尝试以下代码:

SELECT MEMO_SYSTEM_TXT
FROM [EE].[dbo].[EE_Billing_Memo]
WHERE MEMO_SYSTEM_TXT IS NOT NULL AND ASCII(REPLACE(MEMO_SYSTEM_TXT, ' ', '')) != 10

''替换空格后,仅剩下一个''''的ascii码为10

答案 6 :(得分:-1)

您可以在SQL中使用正则表达式。找到与要检测的内容匹配的正则表达式,并将其直接应用于WHERE子句中。