Из TCL используйте переменную в выражении sqlite IN - PullRequest
0 голосов
/ 12 сентября 2018

Я хотел бы выполнить следующий запрос к базе данных sqlite:

set LCs [ DB eval { SELECT DISTINCT LC FROM   MyTable  WHERE LC IN ( 1, 3, 4 ) }  ]

Это дает желаемый результат 1 3 4

Попытка выполнить следующее приводит к синтаксической ошибке:

set InString "1, 3, 4"

set LCs [ DB eval { SELECT DISTINCT LC FROM   MyTable  WHERE LC IN ( :InString ) } ]

Я раньше использовал : Varaible без проблем, но в этом случае это невозможно из-за скобок. Как я могу использовать переменную TCL в оценке SQLite IN?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Если вам нужно переместить несколько значений в SQLite из Tcl, чтобы сделать подобные вещи, сначала поместите их во временную таблицу в базе данных :memory:, а затем используйте операции SQL, чтобы извлечь их оттуда.

DB eval {
    ATTACH DATABASE ':memory:' AS memdb;
    CREATE TEMP TABLE memdb.values (val TEXT);
}
foreach val {1 3 4} {
    DB eval {
        INSERT INTO memdb.values (val) VALUES (:val)
    }
}
set LCs [DB eval {
    SELECT DISTINCT LC FROM MyTable WHERE LC IN memdb.values.val
}]
0 голосов
/ 12 сентября 2018

Согласно документам: «Имена переменных Tcl могут появляться в операторе SQL [...] в любой позиции, где допустимо помещать строковый или числовой литерал».Таким образом, вы можете сделать:

set LCs [DB eval {SELECT DISTINCT LC FROM MyTable WHERE LC IN (:v1, :v2, :v3)}]

, но вы не можете использовать переменную для полного списка.Вместо этого вам нужно либо построить строку перед передачей ее в DB eval, либо создать функцию для проверки наличия значения в списке.

Опция # 1:

set LCs [DB eval "SELECT DISTINCT LC FROM MyTable WHERE LC IN ($InString)"]

Опция # 2:

proc check {val} {
    global InString
    return [expr {$val in $InString}]
}
db function search check
set LCs [DB eval {SELECT LC FROM MyTable WHERE search(LC)}]

Для опции # 2 $ InString должен быть обычным списком Tcl, поэтому не должен разделяться запятыми.

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