给定匹配 "or" 条件的 sqlite select 硬编码文本

sqlite select hard coded text given a matching "or" condition

我有一个 table 这样的:

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;

不知道该怎么做

本质上,你不能,不是都在同一个范围内。

您可以做的是创建一个新列,然后在 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

试试这个:

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;

有了这个select你就可以得到什么样的条件有key的描述 希望有用

您可以为此使用 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 的列超过 1 列,您可以使用 group_concat() 来完成:

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

col1col2col3、...替换为 table 的实际列名。
请参阅简化的 demo.