sqlite выбрать жестко закодированный текст при условии соответствия "или" - PullRequest
0 голосов
/ 24 марта 2020

У меня есть такая таблица:

key,c1,c2,c3,...
--------------
key1,v1,v2,v3, ...
.....
keyn,vn,,,,,...

Я запрашиваю значения столбцов, длина которых равна 0, используя такой оператор:

SELECT key FROM table WHERE length(c1) = 0 OR length(c2) = 0 OR ... OR length(cn) = 0;

Я хотел бы иметь текст, связанный с ключом, указывающий, какое условие приводит к совпадению. так что-то типа

SELECT key,"column 1 length is zero" OR "column 2 length is zero"  ... OR "column N length is zero" FROM table WHERE length(c1) = 0 or length(c2) = 0 or ... or length(cn) = 0;

не уверен, как это сделать

Ответы [ 4 ]

1 голос
/ 24 марта 2020

Вы можете сделать это с помощью group_concat(), если в одной строке более 1 столбца с длиной = 0:

select t.key, group_concat('column ' || nr || ' length is zero') result
from (
  select key, 1 nr, col1 col from tablename
  union all
  select key, 2 nr, col2 from tablename
  union all
  select key, 3 nr, col3 from tablename
) t
where length(t.col) = 0
group by t.key

Заменить col1, col2, col3, ... с фактическими именами столбцов вашей таблицы. Смотрите упрощенную демоверсию .

1 голос
/ 24 марта 2020

попробуйте это:

SELECT key, 
       CASE 
          WHEN length(c1) = 0 THEN 'column 1 length is zero'
          WHEN length(c2) = 0 THEN 'column 2 length is zero'
          ...
          WHEN length(cn) = 0 THEN 'column n length is zero'
       END AS stringLen
    FROM table
    WHERE length(c1) = 0 or length(c2) = 0 or ... or length(cn) = 0;

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

0 голосов
/ 24 марта 2020

Вы можете использовать выражение CASE для этого. С другой стороны, обратите внимание, что в SQLite вы можете использовать MIN() для упрощения предложения WHERE:

select 
    key,
    case 
        when length(c1) = 0 then 'column 1'
        when length(c2) = 0 then 'column 2'
        when length(c3) = 0 then 'column 3'
    end || ' is length 0' which
from mytable
where min(length(c1), length(c2), length(c3)) = 0
0 голосов
/ 24 марта 2020

По сути, вы не можете, не все в одной и той же области.

Что вы можете сделать, это создать новый столбец со значением, которое вы затем будете использовать как в предложении WHERE, так и в SELECT ...

SELECT
  key,
  'column ' || CAST(first_empty_column_id AS TEXT) || ' length is zero'   AS message
FROM
(
  SELECT
    key,
    CASE
      WHEN LENGTH(c1) = 0 THEN 1
      WHEN LENGTH(c2) = 0 THEN 2
      ...
      WHEN LENGTH(cn) = 0 THEN n
    END
      AS first_empty_column_id
  FROM
    table
)
  checked_table
WHERE
  first_empty_column_id IS NOT NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...