Как sqlite3 SELECT по значению COLUMN

Мой SQL db имеет 2 таблицы, uidmap и gidmap, каждая из которых имеет 2 столбца (UID, SID) и (GID, SID) соответственно

Обе таблицы на данный момент имеют одну запись:

GID|SID 30000000|S-1-22-2

UID|SID 30000000|S-1-22-2

Здесь UID / GID - это первичный ключ, а SID также имеет ограничение UNIQUE.

Мне нужно добавить запись в таблицы, но сначала нужно проверить, существует ли такая запись. Проблема у меня в том, что в цикле for мне нужно сделать SELECT из таблицы, где UID=<some-value> или GID=<some-value>

Один из способов сделать это - сначала сопоставить, к какой таблице мы запрашиваем, а затем сопоставить UID или GID.

Есть ли способ напрямую сопоставить значения COLUMN вместо имен?

Что-то типа: для таблицы в ТАБЛИЦАХ: SELECT * FROM table WHERE '%ID'=<some-value> and SID=<some-value>

Также есть один дополнительный запрос, сыворотка сделать следующее не удается:

SELECT * from gidmap where UID=<some-value> Error: no such column: UID

В то время как "" вокруг UID подавляет ошибку отсутствия такого столбца:

SELECT * from gidmap where "UID"=30000000

У UID и GID разные значения?

CL. 10.08.2018 14:19

Нет, это те же ценности, что и сейчас. Но тоже могло быть иначе

mittal 10.08.2018 16:46

Тогда какой смысл в таком запросе? Покажите несколько примеров данных и желаемый результат.

CL. 10.08.2018 18:24

Я обновил вопрос образцами данных и более точной постановкой проблемы

mittal 10.08.2018 18:36

Я также разместил вопрос в конце, почему "" вокруг UID подавляет ошибку?

mittal 11.08.2018 09:39

Это был бы второй, самостоятельный вопрос.

CL. 11.08.2018 09:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
171
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Один из способов упростить эту проблему - использовать опровергать. С его помощью вам не нужно проверять, вставляете ли вы что-то, что уже существует, поскольку эта функция просто обновит его (или сделает что-то безобидное). Хотя это может быть не самый эффективный подход, он устраняет проблему необходимости проверять, существуют ли уже данные перед их вставкой.

В моей версии sqlite нет upsert, sqlite3 --version 3.9.2 2015-11-02

mittal 10.08.2018 20:34

Что вы имеете в виду под «неэффективным»? Как любой другой поиск может быть более эффективным?

CL. 10.08.2018 21:43

@CL. Я имею ввиду в отличие от простой вставки. Более того, обновление с использованием тех же данных, которые уже есть в базе данных, было бы неэффективным процессом.

gregory 11.08.2018 05:01

@mittal upsert доступен начиная с версии 3.24.0. Ваша версия 3.9 несколько устарела, выпущена в 2015 году, я бы подумал о ее обновлении.

gregory 11.08.2018 05:08

@gregory Даже INSERT с ограничениями UNIQUE должен будет проверять старые значения. И УПСЕРТ тоже НИЧЕГО НЕ МОЖЕТ ДЕЛАТЬ.

CL. 11.08.2018 08:28

@gregory Не могу обновить пакет. Это часть огромного индивидуального образа.

mittal 11.08.2018 09:38

@CL, после того, как Грегори предложил UPSERT, я начал изучать INSERT ... VALUE ... ON ... DO NOTHING. Но потом понял, что моя версия sqlite3 устарела и не поддерживает UPSERT

mittal 11.08.2018 09:40

Нет ли возможности ссылаться на столбцы по их значениям, а не по именам?

mittal 11.08.2018 09:41

@mittal Вы настраивали его самостоятельно (в этом случае вы можете настроить его снова), или вы платите кому-то еще за поддержку (в этом случае, за что вы платите?)?

CL. 11.08.2018 09:55

@mittal это немного глупо, но вы можете повернуть таблицу (используя case stmts), чтобы строки стали столбцами, а затем ссылаться на переименованные строки как на столбцы.

gregory 11.08.2018 20:28
Ответ принят как подходящий

В этом случае невозможно сослаться на значение столбца без упоминания имени столбца.

В любом случае, чтобы предотвратить ошибки, когда вы снова пытаетесь вставить те же значения, и если вам не нужно обновлять какие-либо старые строки, вы можете просто использовать ВСТАВИТЬ ИЛИ ПРОЙТИ.

Спасибо, я пойду с INSERT..OR..IGNORE

mittal 22.08.2018 22:46

Другие вопросы по теме