[英]SQL Like and Wildcard with Oracle SQL Developer
我在后端 Oracle DB 上使用 SQL Developer。 我有記錄,買家的名字是皮特漢森。
為什么我嘗試
select * from data1 where buyer = 'Pete Hansen';
我得到結果,沒問題。 但是,當我使用以下內容時,我沒有得到任何結果:
select * from data1 where buyer like 'Pete Hansen';
另外,當我嘗試以下操作時,我沒有得到任何結果
select * from data1 where buyer like 'Pete Hans_n';
但以下效果很好:
select * from data1 where buyer like 'Pete Hans_n%';
你能幫我理解嗎? 提前致謝。
我懷疑它可能與尾隨空格有關, like
運算符不會原諒,但=
是。 要測試它,請嘗試
select * from data1 where trim(buyer) like 'Pete Hansen';
您的buyer
欄似乎被定義為char
; 您可以看到此 db<>fiddle 中重現的問題,但當varchar2
時不會。
字符比較的文檔解釋了空白填充或非填充比較語義之間的區別。 當您將它們與=
進行比較時,因為列和字符串文字都是 `char,所以使用空白填充語義:
使用空白填充語義,如果兩個值的長度不同,則 Oracle 首先將空白添加到較短的末尾,以便它們的長度相等。 ...如果兩個值沒有不同的字符,那么它們被認為是相等的。 此規則意味着如果兩個值僅在尾隨空格的數量上有所不同,則它們是相等的。 Oracle 僅當比較中的兩個值都是數據類型 CHAR、NCHAR、文本文字的表達式或 USER function 返回的值時,才使用空白填充的比較語義。
當列是 `varchar2 時,使用非填充語義:
使用非填充語義,... 如果兩個長度相等的值沒有不同的字符,則認為這些值相等。 只要比較中的一個或兩個值具有數據類型 VARCHAR2 或 NVARCHAR2,Oracle 就會使用非填充比較語義。
LIKE的工作方式不同。 只有您的最終模式與%
匹配,因為這允許char
值中的尾隨空格,而其他兩種模式則不允許。 對於varchar2
版本,其他兩種模式也沒有任何尾隨空格。
需要或想要使用char
列是不尋常的; varchar2
更常見。 多年前,湯姆·凱特(Tom Kyte)對此提出了看法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.