繁体   English   中英

如何使用 if 语句有条件地执行 SQL 查询

[英]How to use if statements to conditionally execute SQL query

我在数据库中有两个字段name_line1name_line2

在输入表单中,它是一个字段“名称”,但通过 substr 对其进行操作以获得两个VARCHAR(30)并分配给上述两个字段。

我想将两个字段连接在一起。 但在数据库中,name_line1 没有尾随空格。 我无法使用此链接Add SPACE to CONCAT with SUBSTR Oracle SQL中的以下代码,因为在某些情况下指向 substr 的点位于单词的中间(在下面的 Stationaries 中的 n 处):

                                 HERE
    Experimental unit 1998 Station|aries Sdn Bhd.
          name_line1                    name_line2

如果 name_line1 不是 30 个字符并且 name_line2 有字符或任何其他更相关的条件,我如何编写代码来有条件地连接空格?

也许这就是你需要的:

WITH sample AS
    (SELECT 1 "SAMPLE", 'Experimental unit 1998' "F1", 'Stationaries Sdn Bhd.' "F2" FROM Dual UNION ALL
     SELECT 2 "SAMPLE", 'Experimental unit 1998 Stationaries ' "F1", ' Sdn Bhd.' "F2" FROM Dual UNION ALL
     SELECT 3 "SAMPLE", 'Experimental unit 1998 Stationaries Sdn Bhd.' "F1", Null "F2" FROM Dual UNION ALL
     SELECT 4 "SAMPLE", Null "F1", Null "F2" FROM Dual UNION ALL
     SELECT 5 "SAMPLE", Null "F1", 'Experimental unit 1998 Stationaries Sdn Bhd.' "F2" FROM Dual)
SELECT 
  F1, F2,
    CASE 
      WHEN F1 Is Null And F2 Is Not Null THEN F2
      WHEN F1 Is Not Null And F2 Is Null THEN F1
      WHEN Length(RTRIM(F1)) <= 30 And Length(LTRIM(F2)) > 0 THEN F1 || ' ' || LTRIM(F2)
      WHEN Length(RTRIM(F1)) > 30 And Length(LTRIM(F2)) > 0 THEN F1 || ' ' || LTRIM(F2)
  ELSE F1
    END "THE_RESULT"
FROM 
    sample 
--
--  R e s u l t
--
--  F1                                           F2                                                 THE_RESULT                                                                              
--  -------------------------------------------- -------------------------------------------------- -----------------------------------------------
--  Experimental unit 1998                       Stationaries Sdn Bhd.                              Experimental unit 1998 Stationaries Sdn Bhd.   
--  Experimental unit 1998 Stationaries           Sdn Bhd.                                          Experimental unit 1998 Stationaries Sdn Bhd.  
--  Experimental unit 1998 Stationaries Sdn Bhd. NULL                                               Experimental unit 1998 Stationaries Sdn Bhd.   
--  NULL                                         NULL                                               NULL                                             
--  NULL                                         Experimental unit 1998 Stationaries Sdn Bhd.       Experimental unit 1998 Stationaries Sdn Bhd.

如您所见,将 CASE 与多个条件一起使用并有意删除可能存在的空格(RTRIM / LTRIM)使您有机会将空间放置在您想要的位置。 结果也可能是或应该是TRIM的主题。

好吧,根据@JNevill 的评论,我使用了以下代码:

Select vendor_id, 
    CASE 
         WHEN LENGTH(name_line1) <30 AND name_line2 IS NOT NULL THEN name_line1||' '||name_line2  
         ELSE name_line1||name_line2 
    END AS FullName 
from ap_vendors where vendor_id like '%YOULINE%';

@dr 的其他案例有助于考虑我是否错过了任何潜在的漏洞,但经过一番考虑,我决定由于 name_line2 中的任何前导空格都是故意的,因此最好保持原样。

代码应涵盖案例

  1. 通过添加空格从 name_line1 中删除尾随空格,
  2. 通过连接而不添加空格来覆盖单词中间的 substr,
  3. 覆盖单词末尾的 substr 而 name_line2 具有前导空格,通过按原样连接而不添加空格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM