如何让LIKE和COUNT返回小于不在行中的值的行数?

时间:2010-09-13 23:53:51

标签: sql database sqlite

例如:

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

我知道它不存在,但是如何更改此行为仍然返回它之前的行数,就好像它在那里?

有什么建议吗?

谢谢。

3 个答案:

答案 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 :(得分: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

更新:继续下面的评论,您可能需要考虑使用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

答案 2 :(得分: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
        )