SQLite-эквивалент Python "'% s% s'% (first_string, second_string)" - PullRequest
0 голосов
/ 20 октября 2010

Как видно из названия, что эквивалентно Python '%s %s' % (first_string, second_string) в SQLite? Я знаю, что могу сделать конкатенацию как first_string || " " || second_string, но это выглядит очень некрасиво.

Ответы [ 5 ]

2 голосов
/ 20 октября 2010

Обратите внимание, что вы можете создавать свои собственные функции уровня SQL.Например, у вас может быть эта функция Python:

def format_data(one, two):
    return "%s %s" % (one, two)

Используйте функцию create_function в pysqlite или функцию CalsW от APSW, чтобы сообщить об этом SQLite.Затем вы можете выполнять запросы, подобные этим:

SELECT format_data(col1, col2) FROM table WHERE condition;
SELECT * from TABLE where col1 = format_data('prefix', col2);

Следовательно, вы можете поместить логику форматирования в ваш удобный читаемый код Python, сохраняя при этом простой SQL, но четко показывая намерение.

2 голосов
/ 20 октября 2010

Я могу понять, что не нравится first_string || ' ' || second_string, но это эквивалентно.Стандартный SQL (на котором SQLite говорит в этой области) просто не самый красивый в мире язык для работы со строками.Вы можете попытаться получить результаты запроса обратно на другой язык (например, Python, который вам нравится) и выполнить там конкатенацию;обычно лучше не делать «представление» на уровне базы данных (и, безусловно, не стоит использовать результат конкатенации в качестве объекта для поиска; это делает невозможным оптимизацию с помощью индексов!)

0 голосов
/ 20 октября 2010

Вы уверены, что не ищете подстановку параметров?

Непосредственно из документации по модулю sqlite3 :

Вместо этого используйте подстановку параметров DB-API. Положил ? в качестве заполнителя везде, где вы хотите использовать значение, а затем укажите кортеж значений в качестве второго аргумента для метода execute () курсора. (Другие модули базы данных могут использовать другой заполнитель, такой как% s или: 1.)

Например:

# Never do this -- insecure!
symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)

# Do this instead
t = (symbol,)
c.execute('select * from stocks where symbol=?', t)

# Larger example
for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ]:
    c.execute('insert into stocks values (?,?,?,?,?)', t)
0 голосов
/ 20 октября 2010

Я не совсем уверен, что вы ищете, но это может быть group_concat агрегатная функция .

0 голосов
/ 20 октября 2010

Нет ни одного.

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