Можно сделать:
select
count(<columnName>)
from
<tableName>
, Если количество возвращается 0, который означает, что все строки в том столбце весь ПУСТОЙ УКАЗАТЕЛЬ (или нет никаких строк вообще в таблице)
может быть изменен на
select
case(count(<columnName>)) when 0 then 'Nulls Only' else 'Some Values' end
from
<tableName>
, Если Вы хотите автоматизировать его, можно использовать системные таблицы для итерации имен столбцов в таблице, Вы интересуетесь
Для небольших проблем, связанных с отношениями, я люблю использовать встроенные наборы Python .
Например, location = 'Boston' OR type = 'Primary', если у вас есть это данные:
users = {
1: dict(Name="Mr. Foo", Location="Boston", Type="Secondary"),
2: dict(Name="Mr. Bar", Location="New York", Type="Primary"),
3: dict(Name="Mr. Quux", Location="Chicago", Type="Secondary"),
#...
}
Вы можете сделать ГДЕ ... ИЛИ ...
запрос вроде этого:
set1 = set(u for u in users if users[u]['Location'] == 'Boston')
set2 = set(u for u in users if users[u]['Type'] == 'Primary')
result = set1.union(set2)
Или только с одним выражением:
result = set(u for u in users if users[u]['Location'] == 'Boston'
or users[u]['Type'] == 'Primary')
Вы также можете использовать функции в itertools для создания достаточно эффективных запросов данных. Например, если вы хотите сделать что-то похожее на GROUP BY city
:
cities = ('Boston', 'New York', 'Chicago')
cities_users = dict(map(lambda city: (city, ifilter(lambda u: users[u]['Location'] == city, users)), cities))
Вы также можете создать индексы вручную (создать dict
сопоставление Location с User ID), чтобы ускорить процесс. . Если это станет слишком медленным или громоздким, я, вероятно, переключусь на sqlite , который теперь включен в стандартную библиотеку Python (2.5).
Я не думаю, что sqlite будет "излишним" - он поставляется со стандартным Python, начиная с версии 2.5, поэтому нет необходимости устанавливать что-то, и он может создавать и обрабатывать базы данных в файлы в памяти или на локальном диске. Действительно, как может быть проще ...? Если вы хотите, чтобы все в памяти, включая начальные значения, и вы хотите использовать dicts для выражения этих начальных значений, например ...:
import sqlite3
db = sqlite3.connect(':memory:')
db.execute('Create table Users (Name, Location, Type)')
db.executemany('Insert into Users values(:Name, :Location, :Type)', [
dict(Name="Mr. Foo", Location="Boston", Type="Secondary"),
dict(Name="Mr. Bar", Location="New York", Type="Primary"),
dict(Name="Mr. Quux", Location="Chicago", Type="Secondary"),
])
db.commit()
db.row_factory = sqlite3.Row
и теперь ваш крошечный «db» в памяти готов к работе. Это' s не сложнее создать БД в файле на диске и / или прочитать начальные значения из текстового файла, CSV и т. д., конечно.
Запросы особенно гибкие, простые и удобные, например, вы можете смешивать вставка строки и замена параметра по желанию ...:
def where(w, *a):
c = db.cursor()
c.execute('Select * From Users where %s' % w, *a)
return c.fetchall()
print [r["Name"] for r in where('Type="Secondary"')]
излучает [u'Mr. Foo ', u'Mr. Quux ']
, точно так же, как более элегантный, но эквивалентный
print [r["Name"] for r in where('Type=?', ["Secondary"])]
и ваш желаемый запрос только:
print [r["Name"] for r in where('Location="Boston" or Type="Primary"')]
и т. Д. Серьезно - что не нравится?
Если это действительно небольшой объем данных, я бы не стал заморачиваться с индексом и, вероятно, просто написал бы вспомогательную функцию:
users = [
dict(Name="Mr. Foo", Location="Boston", Type="Secondary"),
dict(Name="Mr. Bar", Location="New York", Type="Primary"),
dict(Name="Mr. Quux", Location="Chicago", Type="Secondary"),
]
def search(dictlist, **kwargs):
def match(d):
for k,v in kwargs.iteritems():
try:
if d[k] != v:
return False
except KeyError:
return False
return True
return [d for d in dictlist if match(d)]
Которая позволит выполнять красивые запросы вроде этого:
result = search(users, Type="Secondary")