Oracle SQL - 选择除空白或有空格的所有条目

时间:2017-09-06 19:31:36

标签: sql oracle select

你好,下午好,

我正在尝试撰写查询以选择多个客户ID。有时,无论出于何种原因,客户ID(PK)可能有一个空白的客户名称,或者包含4或5个空格的客户名称,但没有数字或字母(名称可以是任何数字或字母的字符串,有时& #34; - "以及)。

如何过滤掉它?除了我的其他WHERE子句之外,我当前的查询看起来像这样。我需要确保CustomerName不仅仅是一堆空格,或者是空的。它需要一些字母数字文本,或者 - :

   SELECT cust.CustomerID, cust.CustomerName
   FROM cust
   WHERE cust.StartDate Between '01-Jun-2017' AND '01-Sep-2017' AND cust.CustomerID Like '%100%' Or cust.CustomerID Like '%200%'

但是,我希望看起来像这样:

   AND CustomerName NOT LIKE '%  %' OR != ""

非常感谢任何建议!

5 个答案:

答案 0 :(得分:2)

我认为以下功能可以帮助您解决问题:

TRIM( [ [ LEADING | TRAILING | BOTH ] trim_character FROM ] string1 )

你也可能需要将上面的内容包裹起来

LENGTH( string1 )

请不要犹豫,向我询问任何进一步的澄清!

泰德

答案 1 :(得分:2)

我假设您的查询要执行以下操作:

AND (CustomerName NOT LIKE '%  %' OR CustomerName != '')

警告!这不会给你一个编译错误,但它不能像你期望的那样工作。 Oracle将''解释为NULL并且没有任何不等于NULL(也没有任何等于NULL)。因此,你的病情的第二部分总是假的,这使得它无用。为了实现你想要的你必须使用

OR CustomerName IS NOT NULL

或如上述其他描述:

OR TRIM(CustomerName) IS NOT NULL

答案 2 :(得分:0)

我想你只想在合适的地方括号:

SELECT cust.CustomerID, cust.CustomerName
FROM cust
WHERE cust.StartDate Between date '2017-06-01' and date '2017-09-01' and 
      (cust.CustomerID Like '%100%' Or cust.CustomerID Like '%200%')

like模式要求客户ID至少为100或200,因此不允许使用空格和空字符串。

您可能还会注意到我更喜欢使用ISO标准格式YYYY-MM-DD的日期常量。

或者,如果您愿意:

SELECT cust.CustomerID, cust.CustomerName
FROM cust
WHERE cust.StartDate Between date '2017-06-01' and date '2017-09-01' and 
      regexp_like(cust.CustomerID, '[12]00')

答案 3 :(得分:0)

这样的事情将解决上述问题:

where customerId is not null
and customerId > ''
and customerId = , replace(customerId, ' ', '') -- this takes care of the spaces

答案 4 :(得分:0)

最好的可能是使用正则表达式:

AND NOT REGEXP_LIKE(CustomerName, '^[[:space:]]*$')