簡體   English   中英

用於文本與數值的 SQL BETWEEN

[英]SQL BETWEEN for text vs numeric values

BETWEENWHERE子句中用於選擇兩個值之間的數據范圍。
如果我是正確的,范圍的端點是否被排除是 DBMS 特定的。
我無法理解的內容如下:
如果我有一個值表並且我執行以下查詢:

SELECT food_name 
    FROM health_foods 
    WHERE calories BETWEEN 33 AND 135;`  

查詢返回的結果行包括卡路里 =33 和卡路里 =135(即包括范圍端點)。

但如果我這樣做:

SELECT food_name 
    FROM health_foods 
    WHERE food_name BETWEEN 'G' AND 'O';

沒有得到以O開頭的food_name行。 即范圍的末尾被排除
為了讓查詢按預期工作,我輸入:

SELECT food_name 
    FROM health_foods 
    WHERE food_name BETWEEN 'G' AND 'P';`   

我的問題是為什么數字和文本數據的BETWEEN有這么大的區別?

之間對數字和字符串的操作方式完全相同。 兩個端點包括在內。 這是 ANSI 標准的一部分,因此它是所有 SQL 方言的工作方式。

表達方式:

where num between 33 and 135

當 num 為 135 時匹配。當 number 為 135.00001 時不匹配。

同樣,表達式:

where food_name BETWEEN 'G' AND 'O'

將匹配 'O',但不匹配任何其他以 'O' 開頭的字符串。

曾經簡單的混搭就是使用“~”。 它具有最大的 7 位 ASCII 值,因此對於英語語言應用程序,它通常運行良好:

where food_name between 'G' and 'O~'

您還可以做其他各種事情。 這里有兩個想法:

where left(food_name, 1) between 'G' and 'O'
where food_name >= 'G' and food_name < 'P'

最重要的一點,雖然是between不管數據類型的方式是相同的。

以“Orange”與“O”為例。 字符串 'Orange' 顯然不等於字符串 'O',因為它更長,所以它必須大於而不是小於。

不過,你可以做 'Orange' < 'OZZZZZZZZZZZZZZZ'。

用正則REGEX試試這個

  WHERE  food_name REGEXP '^[G-O]';

這給了你所有以 G 開頭的食物名稱,直到那些以 O 開頭的食物名稱

演示在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM