С nodejs sqlite3, Как выбрать * где%pattern%, как любой из столбцов в таблице? ИЛИ, похоже, не работает
Я добился очень хороших успехов в переводе моего старого аддона Firefox на nodejs. Вот полное приложение на github: https://github.com/colinkeenan/rentap.js
Тем не менее, я застрял, пытаясь найти значение во всей таблице. Приведенная ниже функция exports.search успешно возвращает список имен (который отображается в раскрывающемся списке выбора), только если шаблон найден в первом столбце (FullName), даже если я использовал OR для вывода списка всех столбцов. (Прокрутите далеко вправо, чтобы увидеть все это.)
Как я могу получить его для поиска по всем столбцам?
exports.search = function(ap_id, pattern, callback) {
getmode(ap_id, function(mode) {
const sqlite3 = require('sqlite3');
let db = new sqlite3.Database('./store.db');
db.serialize(function() {
if (mode==='discarded')
db.all("SELECT FullName, rowid FROM tbl WHERE rowid IN (SELECT discardedRow FROM trash) AND (FullName LIKE (?) OR SSN LIKE (?) OR BirthDate LIKE (?) OR MaritalStatus LIKE (?) OR Email LIKE (?) OR StateID LIKE (?) OR Phone1 LIKE (?) OR Phone2 LIKE (?) OR CurrentAddress LIKE (?) OR PriorAddresses LIKE (?) OR ProposedOccupants LIKE (?) OR ProposedPets LIKE (?) OR Income LIKE (?) OR Employment LIKE (?) OR Evictions LIKE (?) OR Felonies LIKE (?) OR dateApplied LIKE (?) OR dateGuested LIKE (?) OR dateRented LIKE (?)) ORDER BY rowid",
pattern, function(err, matching_names) {
if (err) console.error(err);
matching_names.push({ FullName: 'Choose from Search Results', rowid: 0 });
callback(matching_names);
}
);
else
db.all("SELECT FullName, rowid FROM tbl WHERE rowid NOT IN (SELECT discardedRow FROM trash) AND (FullName LIKE (?) OR SSN LIKE (?) OR BirthDate LIKE (?) OR MaritalStatus LIKE (?) OR Email LIKE (?) OR StateID LIKE (?) OR Phone1 LIKE (?) OR Phone2 LIKE (?) OR CurrentAddress LIKE (?) OR PriorAddresses LIKE (?) OR ProposedOccupants LIKE (?) OR ProposedPets LIKE (?) OR Income LIKE (?) OR Employment LIKE (?) OR Evictions LIKE (?) OR Felonies LIKE (?) OR dateApplied LIKE (?) OR dateGuested LIKE (?) OR dateRented LIKE (?)) ORDER BY rowid",
pattern, function(err, matching_names) {
if (err) console.error(err);
matching_names.push({ FullName: 'Choose from Search Results', rowid: 0 });
callback(matching_names);
}
);
});
db.close();
});
};
Часть, с которой я прошу помощи, - это SQL в db.all:
SELECT FullName, rowid FROM tbl WHERE rowid NOT IN (SELECT discardedRow FROM trash) AND (FullName LIKE (?) OR SSN LIKE (?) OR BirthDate LIKE (?) OR MaritalStatus LIKE (?) OR Email LIKE (?) OR StateID LIKE (?) OR Phone1 LIKE (?) OR Phone2 LIKE (?) OR CurrentAddress LIKE (?) OR PriorAddresses LIKE (?) OR ProposedOccupants LIKE (?) OR ProposedPets LIKE (?) OR Income LIKE (?) OR Employment LIKE (?) OR Evictions LIKE (?) OR Felonies LIKE (?) OR dateApplied LIKE (?) OR dateGuested LIKE (?) OR dateRented LIKE (?)) ORDER BY rowid
Редактировать: я решил сделать поиск в javascript по объекту, возвращенному node-sqlite3, а не напрямую по node-sqlite3, но если кто-то может ответить на исходный вопрос, я все еще хочу знать. Вот рабочая функция в моем файле контроллера, которая выполняет поиск, который я пытался выполнить выше:
var handle_search = function(form, res) {
//node-sqlite3 LIKE isn't working across multiple columns for me even with OR so just doing the search here in javascript
var regexp = RegExp(form.body.pattern, 'ig');
var matching_names = [];
var i, key;
for (i in apsGbl.aps) {
let ap = apsGbl.aps[i];
for (key in ap) {
//have to reset lastIndex of regexp on each field or else it will continue the search from where it last found something in the previous one
regexp.lastIndex = 0;
if (regexp.test(ap[key])) {
matching_names.push({ FullName: ap.FullName, rowid: ap.rowid });
break; //move on to next ap as soon as there's a match because don't want to list the same ap more than once in the search results
}
}
}
matching_names.push({ FullName: 'Choose from Search Results', rowid: 0 });
namesGbl = !Array.isArray(matching_names) || matching_names.length <= 1 ? null : matching_names;
if (form.body.mode === 'new')
res.redirect('/rentap');
else
res.redirect('/rentap/show/' + apsGbl.aps[apsGbl.rownum].rowid);
}