给定匹配 "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
将 col1
、col2
、col3
、...替换为 table 的实际列名。
请参阅简化的 demo.
我有一个 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
将 col1
、col2
、col3
、...替换为 table 的实际列名。
请参阅简化的 demo.