假设您选择的表中的一行包含等于某个String的字段X,并且该字符串包含空格
就我而言
select * from table_name where serial = '400 TZV 50'
我知道该记录存在,但是查询返回一个空集。
有人可以帮助我吗?
答案 0 :(得分:3)
select * from table_name where serial = '400 TZV 50'
我知道该记录存在,但是查询返回一个空集。
例如,如果您有记录:
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';