SQL 案例 |如果 <value> 那么 <SELECT>
SQL case | If <value> then <SELECT>
我想 SELECT
根据用户语言(德语或英语)从 table 中获取一个值。我知道我可以稍后在 PHP if/else 中进行选择,但我想尝试一下我是否可以在我的 SQL 查询中进行选择。我在 SQL CASE
的文档中看到没有满足我要求的示例或解决方案。我不确定这是否可能。正如我所见,THEN
只接受 'text',但没有新的 SQL QUERY。
我的SQL查询
$statement = $pdo->prepare("SELECT
audit.id as audit_id,
audit.questionaire_id,
audit.assigned_auditor,
audit.co_auditor_1_id,
audit.co_auditor_2_id,
audit.comment_positive,
audit.comment_negative,
audit.comment_general,
audit.general_audit_status,
audit.questionaire_id,
audit.audit_date_start,
audit.audit_date_end,
audit.audit_reason,
audit.audited_process,
audit.area,
departments.name,
departments.location,
suppliers.supplier_name,
suppliers.supplier_country,
suppliers.supplier_city,
users.vorname,
users.nachname,
users.email,
questionaire.scheme,
questionaire.quest_name, //German translation
questionaire.quest_name_en // English translation
FROM audit
LEFT JOIN suppliers
ON audit.supplier_id = suppliers.id
LEFT JOIN users
ON audit.supplier_uid = users.id
LEFT JOIN departments
ON audit.department = departments.id
JOIN questionaire
ON audit.questionaire_id = questionaire.id
WHERE audit.id = $id");
$result = $statement->execute(array(':id' => $_GET['id']));
$audit = $statement->fetch();
这里是我想要实现这种 SQL CASE
情况的部分:
我的尝试:
... things before ...
questionaire.scheme,
CASE users.language = 'de' THEN
(SELECT quest_name FROM questionaire WHERE id = audit.questionaire_id)
ELSE (SELECT quest_name_en FROM questionaire WHERE id = audit.questionaire_id)
FROM audit
... things after ...
不需要那么复杂,因为您的查询已经将必要的表连接在一起。
所以而不是
CASE users.language = 'de' THEN
(SELECT quest_name FROM questionaire WHERE id = audit.questionaire_id)
ELSE (SELECT quest_name_en FROM questionaire WHERE id = audit.questionaire_id)
使用
CASE
WHEN users.language = 'de' THEN quest_name
ELSE quest_name_en
END
这是我所知道的用于 Oracle 或 SQL 服务器的 SQL。在这种类型的 CASE 中,您可以检查多种类型,因为条件在 WHEN 子句中。
备选
CASE users.language
WHEN 'de' THEN quest_name
ELSE quest_name_en
END
在此 CASE 中,类型由 CASE 预先设置,因此 WHEN 只能针对相同类型进行评估。就像在这种情况下仅针对字符串。
我想 SELECT
根据用户语言(德语或英语)从 table 中获取一个值。我知道我可以稍后在 PHP if/else 中进行选择,但我想尝试一下我是否可以在我的 SQL 查询中进行选择。我在 SQL CASE
的文档中看到没有满足我要求的示例或解决方案。我不确定这是否可能。正如我所见,THEN
只接受 'text',但没有新的 SQL QUERY。
我的SQL查询
$statement = $pdo->prepare("SELECT
audit.id as audit_id,
audit.questionaire_id,
audit.assigned_auditor,
audit.co_auditor_1_id,
audit.co_auditor_2_id,
audit.comment_positive,
audit.comment_negative,
audit.comment_general,
audit.general_audit_status,
audit.questionaire_id,
audit.audit_date_start,
audit.audit_date_end,
audit.audit_reason,
audit.audited_process,
audit.area,
departments.name,
departments.location,
suppliers.supplier_name,
suppliers.supplier_country,
suppliers.supplier_city,
users.vorname,
users.nachname,
users.email,
questionaire.scheme,
questionaire.quest_name, //German translation
questionaire.quest_name_en // English translation
FROM audit
LEFT JOIN suppliers
ON audit.supplier_id = suppliers.id
LEFT JOIN users
ON audit.supplier_uid = users.id
LEFT JOIN departments
ON audit.department = departments.id
JOIN questionaire
ON audit.questionaire_id = questionaire.id
WHERE audit.id = $id");
$result = $statement->execute(array(':id' => $_GET['id']));
$audit = $statement->fetch();
这里是我想要实现这种 SQL CASE
情况的部分:
我的尝试:
... things before ...
questionaire.scheme,
CASE users.language = 'de' THEN
(SELECT quest_name FROM questionaire WHERE id = audit.questionaire_id)
ELSE (SELECT quest_name_en FROM questionaire WHERE id = audit.questionaire_id)
FROM audit
... things after ...
不需要那么复杂,因为您的查询已经将必要的表连接在一起。 所以而不是
CASE users.language = 'de' THEN
(SELECT quest_name FROM questionaire WHERE id = audit.questionaire_id)
ELSE (SELECT quest_name_en FROM questionaire WHERE id = audit.questionaire_id)
使用
CASE
WHEN users.language = 'de' THEN quest_name
ELSE quest_name_en
END
这是我所知道的用于 Oracle 或 SQL 服务器的 SQL。在这种类型的 CASE 中,您可以检查多种类型,因为条件在 WHEN 子句中。
备选
CASE users.language
WHEN 'de' THEN quest_name
ELSE quest_name_en
END
在此 CASE 中,类型由 CASE 预先设置,因此 WHEN 只能针对相同类型进行评估。就像在这种情况下仅针对字符串。