Выберите числа в диапазоне (от 1 до 100) в sqlite - PullRequest
15 голосов
/ 22 ноября 2010

Я знаю некоторые решения в SQL, но не смог найти ни одного из них в SQlite.

Я просто хочу выполнить запрос на выборку, который возвращает результирующий набор чисел в диапазоне от 1 до 100.

Numbers
  1
  2
  3
  4
  ......
  5

Исправление: у меня вообще нет стола. (однако решение рекомендуется с виртуальной таблицей, такой как dual в MySQL)

Ответы [ 6 ]

24 голосов
/ 07 октября 2014

Спасибо, Сегментзер! Вдохновленный вашим ответом, я пошел дальше и также нашел этот :

WITH RECURSIVE
  cnt(x) AS (
     SELECT 1
     UNION ALL
     SELECT x+1 FROM cnt
      LIMIT 100000
  )
SELECT x FROM cnt;
6 голосов
/ 02 мая 2014

Пример подзапроса для генерации серии 1 <= n <= 100000 в SQLite. Таблица не создается и не используется. </p>

select 1+e+d*10+c*100+b*1000+a*10000 as n from
(select 0 as a union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9),
(select 0 as b union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9),
(select 0 as c union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9),
(select 0 as d union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9),
(select 0 as e union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9);
6 голосов
/ 22 ноября 2010

Как насчет

SELECT * FROM myTable WHERE myNumber >= 1 AND myNumber <= 100;

?

3 голосов
/ 22 июля 2013

Я не думаю, что у SQLite есть чистый способ сделать это, поэтому вам нужно будет использовать интерфейс виртуальной таблицы.SQLite поставляет один для 'C', а apsw имеет один для Python, как я продемонстрирую ниже.Вот документация для интерфейса APSW Virtual Table .

#!/usr/bin/python
import apsw,tempfile

### Opening/creating database
filename=tempfile.mktemp() #insecure - do not use in production code
connection=apsw.Connection(filename)
cursor=connection.cursor()

# This gets registered with the Connection
class Source:
    def Create(self, db, modulename, dbname, tablename, *args):
        schema="create table foo( dummy integer )"
        return schema,Table()
    Connect=Create

# Represents a table
class Table:
    def __init__(self):
        pass

    def BestIndex(self, constraints, orderbys):
        used = []
        self.constraints = []
        ucount = 0
        for c in constraints:
            if c[1] in (
                         apsw.SQLITE_INDEX_CONSTRAINT_GT, 
                         apsw.SQLITE_INDEX_CONSTRAINT_GE,
                         apsw.SQLITE_INDEX_CONSTRAINT_LT,
                         apsw.SQLITE_INDEX_CONSTRAINT_LE,
                         apsw.SQLITE_INDEX_CONSTRAINT_EQ,
                       ):
                used.append( ucount ) #tell sqlite we want to use this one
                self.constraints.append( c[1] ) #save some for later
            else:
                used.append( None ) #skip anything we don't understand
            ucount += 1
        return ( used,    # used constraints list
                  0,      # index number - no biggie we only support one right now
               )

    def Open(self):
        return Cursor(self)

    def Disconnect(self):
        pass

    Destroy=Disconnect

# Represents a cursor
class Cursor:
    def __init__(self, table):
        self.table=table

    def Filter(self, indexnum, indexname, constraintargs):
        start = 0
        self.end = 4000000000
        #map constraint arguments to start and end of generation
        for tc, ca in zip( self.table.constraints, constraintargs ):
            if tc == apsw.SQLITE_INDEX_CONSTRAINT_EQ:
                start = ca
                self.end = ca
            elif tc == apsw.SQLITE_INDEX_CONSTRAINT_LE:
                if self.end > ca:
                    self.end = ca
            elif tc == apsw.SQLITE_INDEX_CONSTRAINT_LT:
                if self.end >= ca:
                    self.end = ca
            elif tc == apsw.SQLITE_INDEX_CONSTRAINT_GE:
                if start < ca:
                    start = ca
            elif tc == apsw.SQLITE_INDEX_CONSTRAINT_GT:
                if start >= ca:
                    start = ca
        self.pos = start

    def Eof(self):
        return self.pos > self.end

    def Rowid(self):
        return self.pos

    def Next(self):
        self.pos+=1

    def Close(self):
        pass

# Register the module as intsource, you can make a bunch if needed
connection.createmodule("intsource", Source())

# Create virtual table to use intsource
cursor.execute("create virtual table uints using intsource()")

# Do some counting
for i in cursor.execute("SELECT rowid FROM uints WHERE rowid BETWEEN 1 AND 100"):
    print i

. Он реализует тип виртуальной таблицы с именем "intsource", который по умолчанию имеет значение от 0 до 4 * 10 ^ 9.Он поддерживает прямую фильтрацию по равенству и сравнению, но любые другие ограничения все равно будут отфильтрованы sqlite.Виртуальные таблицы - очень мощная концепция, с которой вы можете многое сделать, возможно, это один из самых простых способов их использования.Также спасибо за хороший повод попробовать новый API виртуальных таблиц.

0 голосов
/ 22 ноября 2010

Если ваша цель состоит в том, чтобы выбрать фактические записи из таблицы со значениями от 1 до 100, используйте МЕЖДУ, как показано другими респондентами.

Если ваша цель - создать последовательность чисел от 1 до 100не имея таблицы, на которой она будет основана, я не верю, что в SQLite есть функция, которая делает это.

0 голосов
/ 22 ноября 2010
SELECT * FROM myTable WHERE myNumber BETWEEN 1 AND 100;

Это более эффективно, чем использование 2 предложений WHERE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...