SQL中是否有任何内置函数在比较字符串时忽略空格

时间:2016-11-22 13:06:50

标签: sql sql-server string

我正在尝试使用下面的查询在SQL Server中获取记录。

SELECT      TDC_ROW_NUMBER
,           TDC_TD_PARTCODE
            FROM   TD_DATA_PACK_CONTENTS
            WHERE  TDC_IDP_ID = 841
            AND    TDC_TREE_FAMILY_CLASSIFICATION + ', ' + TDC_TREE_CLASSIFICATION + ', ' + TDC_TREE_SUB_CLASSIFICATION + ' , ' + 'A' IN
                   ( SELECT DISTINCT DPC_Level1 + ', ' + DPC_Level2 + ', ' + DPC_Level3 + ', ' + DPC_Status
                     FROM   DATA_PACK_CATEGORIES )
            AND    TDC_TRADE_PRICE > 0.99
            AND    TDC_STATUS = 'RDY'

现在问题是内部查询有一些记录,其中有前导或尾随空白字符。

所以记录看起来'Peripherals, Monitors, Monitors - Medical , A'而另一个字符串看起来像'Peripherals, Monitors, Monitors - Medical, A'

显然,这在比较时失败了。那么有什么功能可以修剪整个字符串中的所有空白字符吗?

4 个答案:

答案 0 :(得分:2)

使用REPLACE()

REPLACE(TDC_TREE_FAMILY_CLASSIFICATION + ', ' + TDC_TREE_CLASSIFICATION + ', ' + TDC_TREE_SUB_CLASSIFICATION + ' , ' + 'A', ' ', '') IN
               (SELECT REPLACE(DPC_Level1 + ', ' + DPC_Level2 + ', ' + DPC_Level3 + ', ' + DPC_Status, ' ', '')
                 FROM DATA_PACK_CATEGORIES )

如果你只关心字符串开头/结尾的空格,你可以使用trim函数(实际上,最后忽略忽略的空格)。

您可以通过嵌套REPLACE()来扩展上述其他字符。

答案 1 :(得分:1)

尝试:

REPLACE(REPLACE(text, ' ', ''),',',', ');

内部替换去除所有空格,当外部在每个逗号后添加单个空格时。

答案 2 :(得分:0)

如果您熟悉正则表达式并且正在使用Oracle(因为无论如何都是关于Oracle 10.x),那么有正则表达式支持。 REGEXP_LIKE和REGEXP_REPLACE的某种组合可以解决这个问题。举个例子:

declare
  first_string varchar2(1000);
  second_string varchar2(1000);
begin
  select 'Peripherals, Monitors, Monitors - Medical , A' into first_string from dual;
  select 'Peripherals, Monitors, Monitors - Medical, A' into second_string from dual;
  DBMS_OUTPUT.PUT_LINE('Whitespace replacement on first_string yields: ' || 
    REGEXP_REPLACE(first_string,'\s'));
  DBMS_OUTPUT.PUT_LINE('Whitespace replacement on second_string yields: ' || 
    REGEXP_REPLACE(second_string,'\s'));
  if REGEXP_REPLACE(first_string,'\s') = REGEXP_REPLACE(second_string,'\s') then
    DBMS_OUTPUT.PUT_LINE('Yes, they are the same, more or less');
  else
    DBMS_OUTPUT.PUT_LINE('My answer is, ''No''');
  end if;
end;

当我运行它时,DBMS_OUTPUT是:

Whitespace replacement on first_string yields: Peripherals,Monitors,Monitors-Medical,A
Whitespace replacement on second_string yields: Peripherals,Monitors,Monitors-Medical,A
Yes, they are the same, more or less

答案 3 :(得分:0)

查看您的SQL,您可以使用:

SELECT DISTINCT DPC_Level1 + ', ' + DPC_Level2 + ', ' + rtrim(DPC_Level3) + ', ' + DPC_Status FROM   DATA_PACK_CATEGORIES

而不是整个字符串上的暴力替换()。这假设尾随空格仅存在于DPC_Level3上 - 您可能希望将其添加到所有元素。