【问题标题】:SQL How to add if else conditions in sqlSQL如何在sql中添加if else条件
【发布时间】:2017-01-21 22:37:45
【问题描述】:

表 A 由 firstname、secondname、lastname、msisdn、registrationdate 组成。表 b 有 firstname、secondname、lastname、msisdn、registrationdate 和其他一些列 - 但我只想考虑提到的这 5 个列。 我有这样的东西

SELECT SELECT A.MSISDN,A.FIRSTNAME,A.SECONDNAME,A.LASTNAME,A.REGDATE, B.MSISDN,B.FIRSTNAME,B.SECONDNAME,B.LASTNAME,B.REGDATE 
FROM TABLE1 A
INNER JOIN TABLE2 B ON A.MSISDN = B.MSISDN
WHERE A.FIRSTNAME != B.FIRSTNAME 
OR A.LASTNAME != B.LASTNAME

以前我只考虑表 A 中的名字、姓氏并检查表 B 中的不匹配,但我得到了数千条记录作为结果,我想缩小搜索范围。

我如何在此处包含 if else 案例,以便

if a.firstname == b.firstname && a.secondname == b.lastname - Ignore this record.

if a.firstname == b.firstname && a.lastname == b.lastname - Ignore this record.

if a.firstname == b.firstname && a.lastname == b.secondname- Ignore this record.

if a.firstname not equal to b.firstname - show this record as result

if a.firstname == b.firstname && a.secondname not equal to b.lastname - show this record as result

否则将所有记录显示为不属于上述任何一种情况的结果。此外,如果可能,请提供一个解决方案,在检查不匹配时忽略大写字母和小写字母。

这里的问题是,在从@sagi 执行查询之后,在结果中我得到的行在名字、名字和姓氏之间完全匹配,但注册日期不同——因为我们没有考虑查询中的注册日期,会影响结果吗?

【问题讨论】:

  • 使用 AND/OR。还有括号。
  • 我对这个问题及其答案有点困惑。我可能遗漏了一些明显的东西,但原来的查询不是已经很好了吗?
  • @Aioros 原始查询只是检查名字和姓氏是否不匹配。但我需要检查其他情况,例如 a.secondname == b.lastname 等,以缩小查询结果的范围。
  • 哦,好吧,我错过了明显的一点。
  • 好吧,其实我也不确定了。我认为现在 OP 想要添加关于名/姓与另一个名/姓相同的条件,但我认为接受的答案不能解决这个问题。

标签: mysql sql if-statement


【解决方案1】:

这应该可以解决问题:

SELECT A.*, B.* 
FROM TABLE1 A
INNER JOIN TABLE2 B ON A.MSISDN = B.MSISDN
WHERE (UPPER(B.FIRSTNAME),UPPER(B.LASTNAME)) NOT IN ((UPPER(A.FIRSTNAME),UPPER(A.LASTNAME)),(UPPER(A.FIRSTNAME),UPPER(A.SECONDNAME)))

不需要IF,如果这个条件返回true,就说明你的条件都满足了,要么first_name不一样,要么last_name是。

【讨论】:

  • 这行得通。满足所有要求的条件。谢谢@sagi
  • 这是一个 MySql 解决方案吗?我不重新理解这种语法(和sybase ;))
  • @AxelH 是的,它应该适用于几乎所有 RDBMS(虽然不了解 sybase)。
  • @sagi 几乎所有 RDBMS,除了 SQL Server,这种语法无效。
  • @sagi 没问题。只是好奇,我仍然不明白这与问题中的查询有什么不同
【解决方案2】:

您可能想使用CASE 表达式。

它们看起来像这样:

SELECT col1, col2, (case when (action = 2 and state = 0) 
 THEN
      1 
 ELSE
      0 
 END)
 as state from tbl1;

【讨论】:

  • 您仍将拥有带有 CASE 的所有记录...因此您需要在派生查询中使用它来过滤您的案例列的结果。
【解决方案3】:

这样就可以了。基本上,您只需要排除名字和第二名/姓氏都匹配的结果。

SELECT A.*, B.* 
FROM TABLE1 A
INNER JOIN TABLE2 B ON A.MSISDN = B.MSISDN
WHERE (NOT (A.FIRSTNAME = B.FIRSTNAME AND A.SECONDNAME = B.LASTNAME))
AND (NOT (A.FIRSTNAME = B.FIRSTNAME AND A.LASTNAME = B.LASTNAME))

【讨论】:

  • 有没有办法排除/忽略具有 a.firstname 和 a.lastname 与 b.firstname 和 b.lastname 匹配的记录,即使 a.secondname 为空但 b.secondname 有一些数据在里面?这个搜索可以忽略大小写吗?这将在很大程度上缩小搜索结果的范围。谢谢
  • @SaiAvinash 此查询排除 a.firstname/b.firstname 和 a.lastname/b.lastname 匹配的所有记录,无论 a.secondname 或 b.secondname 中有什么。此外,使用 LOWER -function 使查询不区分大小写
  • 我猜结果中那些额外的记录是由于两个表中的大写小写字母。有没有办法忽略区分大小写?
  • 我正在查看记录,发现结果中显示了表 a 和表 b 中具有完全相同细节的记录。this record
  • @SaiAvinash 您确定这些值完全相同吗?不是其中一个值包含空格或类似的东西吗?您不需要使用 lower -function,因为 select 语句不敏感。
【解决方案4】:

您可以使用 CASE 起草一个 IF 然后像 Query 。

根据文档 CASE 用于向 SQL 提供 if-then-else 类型的逻辑。有两种格式:第一种是 Simple CASE 表达式,我们将表达式与静态值进行比较。第二种是 Searched CASE 表达式,我们将表达式与一个或多个逻辑条件进行比较。

例子

SELECT CASE ("column_name") 
  WHEN "value1" THEN "result1" 
  WHEN "value2" THEN "result2" 
  ... 
  [ELSE "resultN"] 
  END
FROM "table_name";

【讨论】:

  • 您仍将拥有带有 CASE 的所有记录...因此您需要在派生查询中使用它来过滤您的案例列的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 2016-04-09
  • 2021-03-28
  • 1970-01-01
  • 2020-06-27
相关资源
最近更新 更多