Выберите непустые строки строк в KDB - PullRequest
0 голосов
/ 25 сентября 2018
q)tab

items sales prices detail
-------------------------
nut   6     10     "blah"    
bolt  8     20     ""
cam   0     15     "some text"    
cog   3     20     ""    
nut   6     10     ""    
bolt  8     20     ""    

Я бы хотел выбрать только те строки, в которых «деталь» непуста.Кажется довольно простым, но не я не могу заставить его работать.

q) select from tab where count[detail] > 0

Это дает все строки все еще.

В качестве альтернативы я попытался

q) select from tab where not null detail 

Этодает мне ошибку типа.

Как можно запросить непустые строковые поля в KDB ???

Ответы [ 5 ]

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

Если ваша таблица небольшая, вы можете проверить еще один способ - преобразовать ее в symbol в предложении where.

q)select from ([]detail:("blah";"";"some text")) where `<>`$detail 
detail
-----------
"blah"
"some text"

Или просто

q)select from ([]detail:("blah";"";"some text")) where not null `$detail 
detail
-----------
"blah"
"some text"
0 голосов
/ 25 сентября 2018

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

q)select from tab where not detail like ""

  items sales prices detail
  ------------------------------
  nut   1     10     "blah"
  cam   5     9      "some text"
0 голосов
/ 25 сентября 2018

Используйте наречие каждый:

q)select from ([]detail:("blah";"";"some text")) where 0<count each detail
detail     
-----------
"blah"     
"some text"
0 голосов
/ 25 сентября 2018

Я бы использовал следующий подход

select from tab where not detail~\:""

, где каждая деталь сравнивается с пустой строкой.Подход с not null detail не работает, потому что Q обрабатывает строку как массив символов и проверяет, является ли каждый из элементов массива нулевым.Т.е. null "abc" возвращает логический массив 000b, но условие where ожидает единственное логическое значение для каждой "строки"

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

Поскольку вам нужно выполнить проверку по строкам, используйте each:

select from tab where 0 < count each detail

Это приводит к следующей таблице:

items sales prices detail     
------------------------------
nut   6     10     "blah"     
cam   0     15     "some text"
...