![](/img/trans.png)
[英]MySQL query to determine if a number is greater than a VARCHAR containing a negative value
[英]Mysql query like number greater than x
我有一個評論字段,用於存儲網站上出售的商品的標題以及出價編號(bid_id)。 不幸的是,bid_id並未單獨存儲在該表中。
例如,我要查詢數字(bid_id)大於4,000的項目。
所以,我有:
select * from mysql_table_name where comment like '< 4000'
我知道這行不通,但是我需要類似的東西。
非常感謝!
沒有什么現成的作品那樣。
您可以編寫一個自定義函數或可加載的UDF ,但這將是一項巨大的工作,對數據庫有重大影響。 然后,您可以運行WHERE GET_BID_ID(comment) < 4000
。
您可以更輕松地做的是設計一種使用可用字符串函數提取bid_id
方法。
例如,如果bid_id
始終位於最后十個字符中,則可以提取這些字符,並將所有非數字字符替換為nil。 而剩下的是bid_id
, 那你可以比較。
當然,您需要使用LENGTH()
, SUBSTRING()
和REPLACE()
的復雜表達式。 如果bid_id在容易識別的分隔符之間,則SUBSTRING_INDEX()
可能更適合您。
但是最好還是...添加一個INTEGER列,將其初始化為null, 然后將提取的bid_id
存儲在bid_id
。 或為零(如果您是肯定的),則沒有bid_id
。 將數據存儲在混合上下文中是有害的(並且要引導一個已知的SQL反模式)。 一旦擁有了可用的列,就可以每隔幾秒鍾選擇少量帶有new_bid_id
仍為NULL的項目, new_bid_id
進行提取,從而逐步修改數據庫而不會導致系統超載。
這與在更復雜的情況下使用的方法相同。 我們首先檢查一下我們擁有的(這是一個測試表)
SELECT commento FROM arti LIMIT 3;
+-----------------------------------------+
| commento |
+-----------------------------------------+
| This is the first comment 100 200 42500 |
| Another 7 Q 32768 |
| And yet another 200 15 55332 |
+-----------------------------------------+
所以我們需要最后一個字符:
SELECT SUBSTRING(commento, LENGTH(commento)-5) FROM arti LIMIT 3;
+-----------------------------------------+
| SUBSTRING(commento, LENGTH(commento)-5) |
+-----------------------------------------+
| 42500 |
| 32768 |
| 55332 |
+-----------------------------------------+
這看起來不錯,但事實並非如此; ID之前還有多余的空間。 因此5不起作用,SUBSTRING是基於1的。 不管; 我們只用4。
...我們就完成了。
mysql> SELECT commento FROM arti WHERE SUBSTRING(commento, LENGTH(commento)-4) < 40000;
+-------------------+
| commento |
+-------------------+
| Another 7 Q 32768 |
+-------------------+
mysql> SELECT commento FROM arti WHERE SUBSTRING(commento, LENGTH(commento)-4) BETWEEN 35000 AND 55000;
+-----------------------------------------+
| commento |
+-----------------------------------------+
| This is the first comment 100 200 42500 |
+-----------------------------------------+
問題是如果您有一個不一樣長的數字(例如300和131072)。 然后,您需要為較大的數字取一個足夠大的切片,如果數字較短,則您的切片中可能會得到“ 1 5 300”。 這就是SUBSTRING_INDEX
搶救的原因:通過捕獲從“ 131072”到“ 1 5 300”的七個字符,ID將始終位於slice的最后一個空格中 。
在最后一種情況下 ,當數字的長度不同時,您會發現問題。 提取的ID根本不是數字,對於MySQL來說,它們是字符串 。 這意味着它們按字典順序而不是數字順序進行比較; 和“17534”被認為比“202” 更小 ,就像“愛麗絲”來“鮑勃”之前。 為了解決這個問題,您需要將字符串轉換為無符號整數,這會進一步降低操作速度。
WHERE CAST( SUBSTRING(...) AS UNSIGNED) < 4000
select * from mysql_table_name where substring(comment,start,length, signed integer) < 4000
這將起作用,但是我建議創建一個新列,並將出價值放入其中,然后進行比較。
要更新新列中的值,您可以使用
update table set newcol = substring(comment,start,length)
希望這會有所幫助
只需清理您的bid_id列即可。 然后索引是。
create table `prior`
( id int auto_increment primary key,
comments text not null
);
insert `prior` (comments) values ('asdfasdf adfas d d 93827363'),('mouse cat 12345678');
alter table `prior` add column bid_id int; -- add a nullable int column
select * from `prior`; -- bid_id is null atm btw
update `prior` set bid_id=right(comments,8); -- this will auto-cast to an int
select * from `prior`;
+----+-----------------------------+----------+
| id | comments | bid_id |
+----+-----------------------------+----------+
| 1 | asdfasdf adfas d d 93827363 | 93827363 |
| 2 | mouse cat 12345678 | 12345678 |
+----+-----------------------------+----------+
創建索引:
CREATE INDEX `idxBidId` ON `prior` (bid_id); -- or unique index
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.