2010-09-13 60 views
0

例如:如何獲得LIKE和COUNT以返回小於行中不包含的行數?

SELECT COUNT(ID) FROM My_Table 
WHERE ID < 

(SELECT ID FROM My_Table 
WHERE ID LIKE '%4' 
ORDER BY ID LIMIT 1)  

MY_TABLE:

X   ID Y  
------------------------ 
|  |  A1 |  | 
------------------------ 
|  |  B2 |  | 
------------------------ 
|  |  C3 |  | 
------------------------ -----Page 1 
|  |  D3 |  | 
------------------------ 
|  |  E3 |  | 
------------------------ 
|  |  F5 |  | 
------------------------ -----Page 2 
|  |  G5 |  | 
------------------------ 
|  |  F6 |  | 
------------------------ 
|  |  G7 |  | -----Page 3 

沒有數據,截至4,但仍然有5排,在東西不到 「%4」 結束。

然而,在這種情況下是沒有匹配,所以SQLite的只返回0

我得到它是不存在的,但我要如何改變這種行爲之前,仍返回的行數,就好像它是那裏?

有什麼建議嗎?

謝謝。

回答

1
SELECT COUNT(ID) FROM My_Table 
WHERE ID < (SELECT ID FROM My_Table 
    WHERE SUBSTRING(ID, 2) >= 4 
ORDER BY ID LIMIT 1) 
+1

注意SUBSTRING在您的平臺上可能會有所不同。 – 2010-09-13 23:59:39

+0

@Paulo Scardine:如果凝視「pos」並不總是2呢?並且是動態的?有沒有辦法指定一個起始位置? – 2010-09-14 00:05:23

+0

@Tommy:是的,起始位置可以是一個表達式。 – Unreason 2010-09-14 08:12:31

1

假設總是有id場的數字部分前一個字母,你可能想嘗試以下操作:

SELECT COUNT(*) FROM my_table WHERE CAST(substr(id, 2) as int) <= 4; 

測試用例:

CREATE TABLE my_table (id char(2)); 

INSERT INTO my_table VALUES ('A1'); 
INSERT INTO my_table VALUES ('B2'); 
INSERT INTO my_table VALUES ('C3'); 
INSERT INTO my_table VALUES ('D3'); 
INSERT INTO my_table VALUES ('E3'); 
INSERT INTO my_table VALUES ('F5'); 
INSERT INTO my_table VALUES ('G5'); 
INSERT INTO my_table VALUES ('F6'); 
INSERT INTO my_table VALUES ('G7'); 

結果:

5 

UPDATE:而且下面的評論,你可能要考慮使用ltrim()功能:

ltrim(X,Y)函數返回去除從左邊出現在Y任何和所有字符組成的字符串一邊的X

實施例:

SELECT COUNT(*) 
FROM my_table 
WHERE CAST(ltrim(id, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') as int) <= 4; 

測試用例(添加於上述):

INSERT INTO my_table VALUES ('ABC1'); 
INSERT INTO my_table VALUES ('ZWY2'); 

新結果:

7 
+0

當它不總是2時,處理的最佳方式是什麼? – 2010-09-14 00:06:29

+1

@Tommy:用另一個可能的解決方案更新了我的答案。 – 2010-09-14 00:14:14

+0

謝謝,讓我給ltrim一個嘗試.... – 2010-09-14 00:18:21

1

MySQL,將是:

SELECT COUNT(ID) 
FROM My_Table 
WHERE ID < 
     (
     SELECT id 
     FROM (
       SELECT ID 
       FROM My_Table 
       WHERE ID LIKE '%4' 
       ORDER BY 
         ID 
       LIMIT 1 
       ) q 
     UNION ALL 
     SELECT MAX(id) 
     FROM mytable 
     LIMIT 1 
     ) 
+0

這似乎只返回整行中最大的價值? – 2010-09-16 00:09:38

相關問題