你好,下午好,
我正在尝试撰写查询以选择多个客户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 != ""
非常感谢任何建议!
答案 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:]]*$')