首页 > 解决方案 > SQLDeveloper - 检查另一列中的列

问题描述

我目前正在尝试查询 Last_Name 列是否将后缀添加到 Last_Name 的末尾。

我有一个存储可用后缀(I、II、III、IV、V、Jr.、Sr.)的后缀表(SUFFIX),但是当我执行以下查询时遇到了麻烦,因为它显示了所有姓氏即使它在 LAST_NAME 列的末尾不包含 SUFFIX。

SELECT
NAMES.RECORD_NAME
, NAMES.LAST_NAME
, NAMES.FIRST_NAME
, NAMES.SUFFIX_C AS SUFFIX_ID
, SUFFIX.name AS SUFFIX
, USERS.USER_ID
, NAMES.RECORD_ID

FROM
USERS
left join NAMES ON USERS.NAME_RECORD_ID = NAMES.RECORD_ID
left join SUFFIX ON NAMES.SUFFIX_C = SUFFIX.suffix_c

WHERE
NAMES.SUFFIX_C IS NOT NULL
AND  SUFFIX.name in (select NAMES.LAST_NAME from NAMES)

我想要做的是以下内容:如果后缀 = IV 并且姓氏是 SmithIV(包含后缀)在姓氏的末尾以显示在我的结果中。

出于某种原因,后缀被添加到一些姓氏中,我试图确定有多少受到影响。

标签: sqloracle-sqldeveloper

解决方案


我就是这样理解这个问题的。

第 1 - 15 行代表样本数据;有趣的部分是第 19 - 21 行,它们从姓氏中选择最后的“几个”字符,其中“几个”等于后缀本身的长度。

SQL> with
  2  -- sample data
  3  names (first_name, last_name, suffix_c) as
  4    (select 'Little', 'Foot'   , 1 from dual union all
  5     select 'Big'   , 'FootIV' , 4 from dual union all
  6     select 'Scott' , 'TigerSr', 5 from dual union all
  7     select 'Mike'  , 'Lion'   , 6 from dual
  8    ),
  9  suffix (suffix_c, name) as
 10    (select 1, 'I'  from dual union all
 11     select 2, 'II' from dual union all
 12     select 4, 'IV' from dual union all
 13     select 5, 'Sr' from dual union all
 14     select 6, 'Jr' from dual
 15    )
 16  -- query you might need
 17  select n.*
 18  from names n join suffix s on s.suffix_c = n.suffix_c
 19  where substr(n.last_name,
 20               length(n.last_name) - length(s.name) + 1,
 21               length(s.name)
 22              ) = s.name;

FIRST_NAME LAST_NAME    SUFFIX_C
---------- ---------- ----------
Big        FootIV              4
Scott      TigerSr             5

SQL>

推荐阅读