【问题标题】:SQL case | If <value> then <SELECT>SQL案例 |如果 <value> 则 <SELECT>
【发布时间】:2021-04-22 23:17:07
【问题描述】:

我想SELECT 基于用户语言(德语或英语)从表中获取一个值。我知道我可以稍后在 PHP if/else 中进行选择,但我想尝试是否可以在我的 SQL 查询中进行选择。我在 SQL CASE 的文档中看到没有满足我要求的示例或解决方案。我不确定这是否可能。正如我所见,THEN 只接受“文本”,但没有新的 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();

这里是我要实现这种SQLCASE情况的部分:

我的尝试:

... 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 ...

【问题讨论】:

  • 请提供样本数据和期望的结果。您的查询引用了未定义的 audit
  • 在 SQL 中没有理由这样做。您已经定义了表和列 - 只需在您的应用程序代码中进行。
  • 您可以将 CASE 语句简化为 CASE users.language WHEN 'de' THEN quest_name_de ELSE quest_name_en END AS quest_name - 不需要 SELECT 子查询,因为您已经加入了 questionaire 表。
  • 我在下面添加了我的原始查询以供您理解和我的想法。
  • 按照语法要求将WHEN放在CASE之后,并将END放在最后一个右括号之后。

标签: sql if-statement join select case


【解决方案1】:

不需要像您的查询已经将必要的表连接在一起那样复杂。 所以不是

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 Server 的 SQL。在这种类型的 CASE 中,您可以检查多种类型,因为条件在 WHEN 子句中。

另类

CASE users.language
  WHEN 'de' THEN quest_name 
  ELSE quest_name_en 
END

在这种情况下,类型是由 CASE 预先设置的,因此 WHEN 只能针对相同的类型进行评估。就像在这种情况下只针对字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-09
    • 2011-08-12
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多