2016-02-19 2 views
0

В этом link приведен пример включения динамического параметра. d в запросе выборки КДБ:Конкатенация строк KDB с символьным списком для динамического запроса

h: hopen`:myhost01:8012 // open connection 
d: 2016.02.15 // define date var 
symList: `GBPUSD`EURUSD 
h raze "select from MarketDepth where date=", string d, ", sym in `GBPUSD`EURUSD" // run query with parameter d 

Здесь d имеет тип date и легко струнной СЦЕПИТЬ для того, чтобы сформировать динамический запрос.

Если я хочу добавить symList как динамический параметр, а также путем преобразования в строку:

raze "select from MarketDepth where date=", string d, ", sym in ", string symList 

Сцепленная строка становится: select from MarketDepth where date=2016.02.15, sym in GBPUSDEURUSD, другими словами, конкатенация теряет кавычку поэтому запрос не выполняется , Как я могу это решить?

p.S: Я знаю о functional querying, но после провала в течение 2 часов я отказался от этого.

ответ

1

Вы правы, string SYMBOL не сохраняет характер одиночного обратную кавычки, так что вы должны будете добавить его самостоятельно, как это:

symList: `GBPUSD`EURUSD 
strSymList: "`",'string symList/("`GBPUSD";"`EURUSD") 

я присоединиться , с each-both adverb' присоединиться к с обратным одиночными кавычками каждого элемент списка. Имея свой список символ строковой динамический запрос становится

"select from MarketDepth where date=", (string d), ", sym in ",raze"`",'string symList 

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

q) parse "select from MarketDepth where date=", (string d), ", sym in ",raze"`",'string symList 
(?;`MarketDepth;enlist ((=;`date;2016.02.15);(in;`sym;enlist `GBPUSD`EURUSD));0b;()) 

Теперь это легко создать функциональный выбор:

?[`MarketDepth;enlist ((=;`date;2016.02.15);(in;`sym;enlist symList));0b;()] 

Надеется, что это помогает.

Обновление: Решение @ Райана Гамильтона, вероятно, является лучшим в вашем конкретном сценарии. Вы можете даже сделать таблицу назвать аргумент, если вы хотите:

h({[t;d;s]select from t where date=d,sym in s};`MarketDepth; d; symList) 

Но стоит отметить, что вы не можете использовать эту технику, когда вам нужно сделать список столбцов динамических. Ниже будет НЕ работы:

h({[c;d;s]select c from t where date=d,sym in s};`time`sym; d; symList) 

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

+0

Спасибо, я потратил часы на функциональный выбор, поскольку это кажется правильным способом сделать это. Однако обработанное дерево вызывает ошибку при попытке выполнить запрос. Мне удалось запустить его для более простых таблиц, но когда один из условных столбцов имеет символ типа, он как-то не работает. – Rhubarb

+0

@ Zhubarb: выполняет ли функциональный выбор, который я показал, не работает? –

+0

Я его не тестировал, но этого я не смог заставить работать. Таблица: 't: ([] col1: 8?' A'b; col2: til 8; col3: 8? 9.) '. И когда я разбираю это: 'select from t, где col1 =' a, col2 <4', я получаю '? [' T; enlist ((=; 'col1; заручиться' a); (<; 'col2; 4)); 0b;()] ', что не дает ожидаемого результата (т. Е. Дает строку, где col1 - b). (Извините, backticks mess форматирование вверх) – Rhubarb

6

Нет необходимости в функциональных отборах.

q)MarketDepth:([] date:9#2016.02.15; sym:9#`A`B) 
q)d:2016.02.15 
q)symList:`B 

q)h ({[dt;sl] select from MarketDepth where date=dt,sym in sl}; d; symList) 
date  sym 
-------------- 
2016.02.15 B 
2016.02.15 B 
2016.02.15 B 
2016.02.15 B 
+0

Спасибо за ваш ответ! – Rhubarb

0

Другие уже дали хорошие альтернативные подходы к вашей проблеме. Но в случае, если вам нужно присоединиться к строкам и символам (или другим типам данных), не теряя обратную линию, функция .Q.s1 выполняет эту задачу.

q) .Q.s1 `a`b 
q)"`a`b" 
q)"select from table where sym in ",.Q.s1 symlist 

Примечание: Как правило, это не рекомендуется использовать .Q функции пространства имен.

Смежные вопросы