我构建查询以从数据库中搜索多行,例如
SELECT
*
FROM
table1
WHERE col1 = '012311'
OR col1 = '0123631'
OR col1 = '091233'
OR col1 = '092111'
这里它返回前3个值,因为它们存在于表中,但它不返回最后一个值,因为它不在表中。那么如果没有找到该值的行,如何在查询中设置我的默认值?
答案 0 :(得分:7)
有几种方法,取决于数据集。这是一种方式:
SELECT *,
IFNULL(
( SELECT col1 FROM table1
WHERE col1 IN ('012311','0123631','091233','092111')
),
'some_value'
) AS my_col1
FROM table1;
不需要复制+粘贴,您必须根据具体情况进行调整。
答案 1 :(得分:4)
在MySQL中,如果没有找到行,即返回NULL时,可以使用IFNULL返回指定的值 前 -
SELECT IFNULL( (SELECT col1 FROM table1 WHERE col1 in (your_list)) ,'default_value_you_want_to_return');
你可以在这里看到IFNULL的例子 - IFNULL Example
答案 2 :(得分:1)
我想在这个+ 2.5yo问题上加入,并根据WHERE子句做出假设,Jadeja RJ只想返回四行而不是整个表(也许表有100,000行使结果集非常臃肿)。
我不想在SELECT中使用greedy *,所以我将col1
用作行标识符,col2
作为其关联值。当然,可以根据需要指定更多列。
这是一种硬编码所需行数并标记缺失行的方法:
SELECT hardrows.col1,IFNULL(table1.col2,'Not Found')
FROM
(
(SELECT '012311' AS `col1`) UNION
(SELECT '0123631') UNION
(SELECT '091233') UNION
(SELECT '092111')
) AS `hardrows`
LEFT JOIN `table1`
ON hardrows.col1=table1.col1;
当然,我正在使用这个建议进行多项假设。我不知道表中有多少行,需要声明多少个硬编码行,也不知道实际查询中是否存在可能使其效率低下的其他子句/表达式。优点是纯粹控制返回的行数。
最后,如果标识符数组由另一个数据库表提供,那么该表应该替换hardrows
。
答案 3 :(得分:0)
SELECT
CASE WHEN col1 = NULL THEN "NULL" ELSE col1 END AS 'col1'
FROM table1
WHERE
col1 = '012311'
OR col1 = '0123631'
OR col1 = '091233'
OR col1 = '092111'
这可能与您正在寻找的内容一致,格式化。如果col1为NULL,则返回字符串“NULL”(可以替换)。如果col1为NOT NULL,则返回值结果。
希望这有效!
答案 4 :(得分:0)
我创立的最好方法是:
SELECT COALESCE(col1, 'defaultValue') col1, COUNT(*) cRows
FROM table1
WHERE colx = 'filter';
此查询返回 2 列: