MySQL SUBSTRING, использующий запрашиваемые значения длины и позиции в сравнении с подстрокой языка программирования после извлечения
Я получаю доступ к структурированной базе данных MySQL в chado. Я ищу по продукту гена, для этого примера продуктом является "бифункциональная GDP-фукозинтетаза: GDP-4-дегидро-6-дезокси-D-манноза эпимераза и GDP-4-дегидро-6-L-дезоксигалактоза редуктаза".
Затем я могу использовать операторы JOIN, чтобы найти, в какой сборке находится этот ген и каковы его координаты. Приведенный ниже оператор SQL действителен и будет возвращать последовательность сборки (не только последовательность гена), а также начальную и конечную позиции интересующего гена в сборке.
SELECT f.uniquename AS protein_accession, product.value AS protein_name, srcfeature.residues AS residue_sequence, srcassembly.name AS source_type, location.fmin AS location_min, location.fmax AS location_max, location.strand
FROM feature f
JOIN cvterm polypeptide ON f.type_id=polypeptide.cvterm_id
JOIN featureprop product ON f.feature_id=product.feature_id
JOIN cvterm productprop ON product.type_id=productprop.cvterm_id
JOIN featureloc location ON f.feature_id=location.feature_id
JOIN feature srcfeature ON location.srcfeature_id=srcfeature.feature_id
JOIN cvterm srcassembly ON srcfeature.type_id=srcassembly.cvterm_id
WHERE polypeptide.name = 'polypeptide'
AND productprop.name = 'gene_product_name'
AND product.value LIKE '%bifunctional GDP-fucose synthetase: GDP-4-dehydro-6-deoxy-D-mannose epimerase and GDP-4-dehydro-6-L-deoxygalactose reductase%';
Последовательность сборки очень и очень длинная, и мне определенно не нужно все это. Лучше ли извлечь нужную часть, используя метод SUBSTRING MySQL, чтобы сохранить извлечение всей последовательности, или использовать метод подстроки языка программирования после извлечения? Приведенный ниже запрос является моей попыткой использования метода SUBSTRING с использованием значений, полученных во время запроса для определения положения и длины. Это не работает, я думаю, что для работы нужно несколько операторов SELECT. SQL становится действительно уродливым, и я даже не уверен, что рабочий конечный результат будет лучше.
Что вы думаете, лучше сделать это с помощью SQL SUBSTRING или просто использовать язык программирования и метод подстроки, чтобы отобразить то, что я хочу, даже если я получил все это?
SELECT f.uniquename AS protein_accession, product.value AS protein_name, SUBSTRING(srcfeature.residues AS residue_sequence, location_min, location_max - location_min), srcassembly.name AS source_type, location.fmin AS location_min, location.fmax AS location_max, location.strand
FROM feature f
JOIN cvterm polypeptide ON f.type_id=polypeptide.cvterm_id
JOIN featureprop product ON f.feature_id=product.feature_id
JOIN cvterm productprop ON product.type_id=productprop.cvterm_id
JOIN featureloc location ON f.feature_id=location.feature_id
JOIN feature srcfeature ON location.srcfeature_id=srcfeature.feature_id
JOIN cvterm srcassembly ON srcfeature.type_id=srcassembly.cvterm_id
WHERE polypeptide.name = 'polypeptide'
AND productprop.name = 'gene_product_name'
AND product.value LIKE '%bifunctional GDP-fucose synthetase: GDP-4-dehydro-6-deoxy-D-mannose epimerase and GDP-4-dehydro-6-L-deoxygalactose reductase%';
РЕДАКТИРОВАТЬ Вот пример результата для другого гена (более короткое имя). Я опустил часть в запрашиваемой последовательности, так как эта часть насчитывает тысячи символов. Я должен был бы использовать значения location_min и location_max, показанные здесь, чтобы ПОДПИСАТЬСЯ правильно.
+-------------------+---------------------------------------------------+-------------+--------------+--------------+--------+
| protein_accession | protein_name | source_type | location_min | location_max | strand |
+-------------------+---------------------------------------------------+-------------+--------------+--------------+--------+
| ECDH10B_0026 | bifunctional riboflavin kinase and FAD synthetase | assembly | 21406 | 22348 | 1 |
+-------------------+---------------------------------------------------+-------------+--------------+--------------+--------+
2 ответа
Ваш as
был не в том месте. Это должно пойти после закрытия парена для substring()
:
SELECT f.uniquename AS protein_accession, product.value AS protein_name,
SUBSTRING(srcfeature.residues, location_min, location_max - location_min) AS residue_sequence,
srcassembly.name AS source_type, location.fmin AS location_min, location.fmax AS location_max, location.strand
FROM feature f
JOIN cvterm polypeptide ON f.type_id=polypeptide.cvterm_id
JOIN featureprop product ON f.feature_id=product.feature_id
JOIN cvterm productprop ON product.type_id=productprop.cvterm_id
JOIN featureloc location ON f.feature_id=location.feature_id
JOIN feature srcfeature ON location.srcfeature_id=srcfeature.feature_id
JOIN cvterm srcassembly ON srcfeature.type_id=srcassembly.cvterm_id
WHERE polypeptide.name = 'polypeptide'
AND productprop.name = 'gene_product_name'
AND product.value LIKE '%bifunctional GDP-fucose synthetase: GDP-4-dehydro-6-deoxy-D-mannose epimerase and GDP-4-dehydro-6-L-deoxygalactose reductase%';
Что касается вашего другого вопроса, я думаю, что имеет гораздо больше смысла извлекать данные, которые вы хотите в запросе, а не передавать ненужные данные в приложение. Это экономит на коммуникационных накладных расходах. Плюс, база данных имеет возможность работать параллельно, если она использует несколько потоков / процессоров.
Если что-то подобное будет работать для вас:
SELECT f.uniquename AS protein_accession,
product.value AS protein_name,
SUBSTRING(
srcfeature.residues,
patindex('%SOMPATTERN%',srcfeature.residues),
LEN(srcfeature.residues) - patindex('%SOMPATTERN%',srcfeature.residues)
) AS residue_sequence,
srcassembly.name AS source_type,
затем попробуйте это в SQL. Если нет, используйте язык программирования приложений.