3

在尝试使用 SQL 查询中的 IN 运算符从表中获取数据时,如果没有可用于该条件的行,则不会返回任何行,如下例所示:

mysql> SELECT * FROM employee_tbl;
+------+------+------------+--------------------+
| id   | name | work_date  | daily_typing_pages |
+------+------+------------+--------------------+
|    1 | John | 2007-01-24 |                250 |
|    2 | Ram  | 2007-05-27 |                220 |
|    3 | Jack | 2007-05-06 |                170 |
|    3 | Jack | 2007-04-06 |                100 |
|    4 | Jill | 2007-04-06 |                220 |
|    5 | Zara | 2007-06-06 |                300 |
|    5 | Zara | 2007-02-06 |                350 |
+------+------+------------+--------------------+

mysql> SELECT daily_typing_pages FROM employee_tbl WHERE name IN ('John','Ram','XYZ');

O/p 将如下所示,只有 2 行:

daily_typing_pages  |
--------------------+
                250 |
                220 |

我需要的是在值不匹配的情况下具有一些恒定值。所以我期待的输出是

daily_typing_pages  |
--------------------+
                250 |
                220 |
                100 |

有可能做到这一点吗?

编辑:最后设置 SQL 的值。

4

3 回答 3

1

那么你有几个选择来实现这一点。但是,它们中的大多数都是“绕过”问题的解决方法。问题很简单,您的数据不一致。选择一个不存在的用户不应该产生任何结果(这会发生但不是您想要的结果)。

选项 1.) 修复数据:将缺少的用户 XY 插入表中,将未设置的值保留为 NULL。(然后你可以使用IFNULL(pages, 100)或任何你喜欢的默认值

选项 2.) Str2Rows:您可以创建一个存储过程或函数,它允许您将给定的字符串动态转换为A,B,C三行临时表,因此您可以使用employee_tbl 进行左/右连接。

选项 3。)结果表:创建一个表,等于您的用户表。只插入要查询的名称和默认值。然后SELECT INTO从您的员工表中执行。(XY 的默认值将保持不变)

选项 4.) 将非现有用户的值插入 OUT OF SQL(因此在显示结果时)

然而,比消除症状“更好”的是解决原因,所以我建议你选择选项 1。


编辑:选项 3 可能如下所示:http ://sqlfiddle.com/#!2/82f9e/2

1.)清除您的结果表(请注意,名称需要是唯一的替换才能工作)

2.) 将您需要的结果插入到您的结果表中:

INSERT InTO employee_result (name,pages) VALUES ("John", NULL);
INSERT InTO employee_result (name,pages) VALUES ("Ram", NULL);
INSERT InTO employee_result (name,pages) VALUES ("XY", NULL);

3.) 替换那些有值的用户的空值:

REPLACE INTO employee_result (name, pages) SELECT name, pages FROM employee_tbl
WHERE name in (SELECT name FROM employee_result);

4.) 检索结果集并为那些没有自己值的人设置默认值。

SELECT name, IFNULL(pages,100) from employee_result;

这也可以被“修改”以使用存储过程和临时表。(那将是选项 2)

希望能帮助到你。

于 2013-04-16T06:44:48.450 回答
0

根据您的问题和示例,两个查询之间的 UNION 可能很容易解决您的问题:

联盟

(SELECT daily_typing_pages FROM employee_tbl WHERE name IN ( 'John','Ram' ,'XYZ'))
UNION
(SELECT constantValue FROM employee_tbl WHERE NOT name IN ( 'John','Ram' ,'XYZ'))

见:http ://www.mysqltutorial.org/sql-union-mysql.aspx

于 2013-04-16T05:17:54.483 回答
0

你可以SELECT name, (CASE WHEN name IN('John','Ram' ,'XYZ') THEN daily_typing_pages ELSE 100 END) FROM employee_tbl。这应该够了吧。

于 2013-04-16T06:50:43.707 回答