在Oracle SQL Developer中搜索包含空格的字符串

时间:2018-10-04 08:07:51

标签: sql oracle

假设您选择的表中的一行包含等于某个String的字段X,并且该字符串包含空格

就我而言

select * from table_name where serial = '400 TZV 50'

我知道该记录存在,但是查询返回一个空集。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

select * from table_name where serial = '400 TZV 50'
     

我知道该记录存在,但是查询返回一个空集。

例如,如果您有记录:

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE table_name ( serial VARCHAR2(64) );
INSERT INTO table_name
  SELECT '400 TZV  50' FROM DUAL UNION ALL                      -- Extra space in middle
  SELECT '400 TZV 50 ' FROM DUAL UNION ALL                      -- Extra space at the end
  SELECT '400 TZV 50' || CHR(13) || CHR(10) FROM DUAL UNION ALL -- CR/LF at the end
  SELECT '400' || CHR(9) || 'TZV 50' FROM DUAL;                 -- Tab instead of space

查找您认为应该匹配的记录。您可以使用LIKE

SELECT serial, '400 TZV 50' AS match
FROM   table_name
WHERE  serial LIKE '400%TZV%50%'

REGEXP_LIKE

SELECT serial, '400 TZV 50' AS match
FROM   table_name
WHERE  REGEXP_LIKE( serial, '400\s+TZV\s+50\s*' )

两者都输出:

Results

|       SERIAL |      MATCH |
|--------------|------------|
|  400 TZV  50 | 400 TZV 50 |
|  400 TZV 50  | 400 TZV 50 |
| 400 TZV 50   | 400 TZV 50 |
|              |            |
|   400 TZV 50 | 400 TZV 50 |

然后您可以查看并查看值是否不同。

如果看不到为什么不匹配,请使用DUMP函数获取数据类型中的基础字节值:

SELECT DUMP( serial ) AS serial, DUMP( '400 TZV 50' ) AS match
FROM   table_name
WHERE  REGEXP_LIKE( serial, '400\s+TZV\s+50\s*' )

哪个输出:

Results

|                                            SERIAL |                                        MATCH |
|---------------------------------------------------|----------------------------------------------|
|    Typ=1 Len=11: 52,48,48,32,84,90,86,32,32,53,48 | Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48 |
|    Typ=1 Len=11: 52,48,48,32,84,90,86,32,53,48,32 | Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48 |
| Typ=1 Len=12: 52,48,48,32,84,90,86,32,53,48,13,10 | Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48 |
|        Typ=1 Len=10: 52,48,48,9,84,90,86,32,53,48 | Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48 |

您会看到值是不同的(忽略typ值,因为一个是字符串文字,另一个是存储在表中的VARCHAR2

  • 第一行的长度与中间的多余空格不同:

    Typ= 1 Len=11: 52,48,48,32,84,90,86,32,32,53,48
    Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48
               ^^                          ^^
    
  • 第二个字母的长度与结尾处的多余空格不同:

    Typ= 1 Len=11: 52,48,48,32,84,90,86,32,53,48,32
    Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48
               ^^                               ^^^
    
  • 第三个字符的长度与末尾的CR / LF字符不同:

    Typ= 1 Len=12: 52,48,48,32,84,90,86,32,53,48,13,10
    Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48
               ^^                               ^^^^^^
    
  • ,并且当期望ASCII值为32(空格)时,最后一行的第4个字符的ASCII值为9(制表符)。

    Typ= 1 Len=10: 52,48,48,9,84,90,86,32,53,48
    Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48
                            ^^
    

确定了查询不匹配的原因后,可以对其进行调整以匹配实际数据,或者,如果数据格式不正确,则可以将表中的值固定为期望的格式。 / p>

答案 1 :(得分:1)

这将起作用:

select * from table_name where serial like '400%TZV%50';