oracle 如何在case语句中连接值?

qv7cva1a  于 2022-12-18  发布在  Oracle
关注(0)|答案(2)|浏览(190)

表的DDL:

CREATE TABLE "AUTH_USER_REGISTRATION" 
   (    "USER_ID" NUMBER(*,0), 
    "USER_NAME" VARCHAR2(200 BYTE), 
    "MAIL" VARCHAR2(400 BYTE), 
    "FULLNAME" VARCHAR2(200 BYTE), 
    "GENDER" VARCHAR2(50 BYTE), 
    "USER_DAY" VARCHAR2(10 BYTE), 
    "USER_MONTH" VARCHAR2(50 BYTE), 
    "USER_YEAR" VARCHAR2(50 BYTE), 
    "CREATED" NUMBER(38,0), 
    "STATUS" VARCHAR2(10 BYTE), 
    "UU_ID" VARCHAR2(100 BYTE), 
    "MOBILE" VARCHAR2(100 BYTE), 
    "CHANGED" NUMBER(38,0)
   );

插入语句:

Insert into AUTH_USER_REGISTRATION (USER_ID,USER_NAME,MAIL,FULLNAME,GENDER,USER_DAY,USER_MONTH,USER_YEAR,CREATED,STATUS,UU_ID,MOBILE,CHANGED) values (914981,'srik1977@gmail.com','srikes1977@gmail.com','Birendra Mohan',null,'05','March','1977',1412433302,'1','69945218-cc7f-46f5','9471067',null);
Insert into AUTH_USER_REGISTRATION (USER_ID,USER_NAME,MAIL,FULLNAME,GENDER,USER_DAY,USER_MONTH,USER_YEAR,CREATED,STATUS,UU_ID,MOBILE,CHANGED) values (916653,'mah@gmail.com','mahe@gmail.com','MAHESH DEOCHAKE','male','18','July','1989',1412439002,'1','4563adc0-345b-4779-a8ee','7709910',null);
Insert into AUTH_USER_REGISTRATION (USER_ID,USER_NAME,MAIL,FULLNAME,GENDER,USER_DAY,USER_MONTH,USER_YEAR,CREATED,STATUS,UU_ID,MOBILE,CHANGED) values (916665,'hars@hotmail.com','haveri@hotmail.com','Harshal Jhaveri',null,'08','May','1992',1412439002,'1','a10a3f0c-5892-4579-aef6-46a','8568013',null);
Insert into AUTH_USER_REGISTRATION (USER_ID,USER_NAME,MAIL,FULLNAME,GENDER,USER_DAY,USER_MONTH,USER_YEAR,CREATED,STATUS,UU_ID,MOBILE,CHANGED) values (890991,'gu1952@gmail.com','gunran1952@gmail.com','subramani gunasekaran','male','17','October','1950',1412358602,'1','6b4c7077-8864-4702-','44697999',null);
Insert into AUTH_USER_REGISTRATION (USER_ID,USER_NAME,MAIL,FULLNAME,GENDER,USER_DAY,USER_MONTH,USER_YEAR,CREATED,STATUS,UU_ID,MOBILE,CHANGED) values (891053,'amini@gmail.com','amihani@gmail.com','AMIR RANJAN DHANI','male','20','August','1992',1412358602,'1','62dd0cb4-c86b-4634-ba6','9432880',null);
Insert into AUTH_USER_REGISTRATION (USER_ID,USER_NAME,MAIL,FULLNAME,GENDER,USER_DAY,USER_MONTH,USER_YEAR,CREATED,STATUS,UU_ID,MOBILE,CHANGED) values (891055,'pringhc0@gmail.com','pravghc0@gmail.com','Praveen Singh Chouhan','male','10','April','1990',1412358602,'1','037f1079-db85-49d7','04663542',null);
Insert into AUTH_USER_REGISTRATION (USER_ID,USER_NAME,MAIL,FULLNAME,GENDER,USER_DAY,USER_MONTH,USER_YEAR,CREATED,STATUS,UU_ID,MOBILE,CHANGED) values (892719,'badkt@yahoo.com','bammadkt@yahoo.com','Muhammed Basheer','male','05','July','1994',1412362502,'1','10c07ce7-badf-4204-b2a9','7232903',null);
Insert into AUTH_USER_REGISTRATION (USER_ID,USER_NAME,MAIL,FULLNAME,GENDER,USER_DAY,USER_MONTH,USER_YEAR,CREATED,STATUS,UU_ID,MOBILE,CHANGED) values (892729,'swaar@gmail.com','swnwar@gmail.com','swapnil papinwar','male','08','September','1986',1412362502,'1','2f8940ef-3136-425','9818122',null);
Insert into AUTH_USER_REGISTRATION (USER_ID,USER_NAME,MAIL,FULLNAME,GENDER,USER_DAY,USER_MONTH,USER_YEAR,CREATED,STATUS,UU_ID,MOBILE,CHANGED) values (896209,'raj@yahoo.com','rajan@yahoo.com','Rajiv Nayan','male','10','June','1969',1412388301,'1','8008f636-916b-4982-baad-','9810769',null);
Insert into AUTH_USER_REGISTRATION (USER_ID,USER_NAME,MAIL,FULLNAME,GENDER,USER_DAY,USER_MONTH,USER_YEAR,CREATED,STATUS,UU_ID,MOBILE,CHANGED) values (465,'Jaysparikh','jay@gmail.com','Jay Parikh','male','31','January','1984',1406359580,'1','c04b7129-b04e-4ca5-9199-','9586817',null);
Insert into AUTH_USER_REGISTRATION (USER_ID,USER_NAME,MAIL,FULLNAME,GENDER,USER_DAY,USER_MONTH,USER_YEAR,CREATED,STATUS,UU_ID,MOBILE,CHANGED) values (476,'sknyer','sknr@gmail.com','Sasidharan Nair','male','26','October','1968',1406359591,'1','69288f05-bfbb-4f5e-9561-71e','530154',null);
Insert into AUTH_USER_REGISTRATION (USER_ID,USER_NAME,MAIL,FULLNAME,GENDER,USER_DAY,USER_MONTH,USER_YEAR,CREATED,STATUS,UU_ID,MOBILE,CHANGED) values (504,'casstifer','sir@gmail.com','Aditya Verma','male','25','December','1995',1406359633,'1','a4e8ad7b-a5f8-476b-a779-','742842',null);

质询:

SELECT
    user_id as user_id,
    user_name as user_name,
    mail as user_mail,
    fullname as full_name,
    case when (gender='male' or gender='mail' or gender='Male') then 'Male'
    when (gender='female' or gender='Female') then 'Female' else 'Others'
    end as gender,
    case
    when user_month='January' then '1'
    when user_month='February' then '2'
    when user_month='March' then '3'
    when user_month='April' then '4'
    when user_month='May' then '5'
    when user_month='June' then '6'
    when user_month='July' then '7'
    when user_month='August' then '8'
    when user_month='September' then '9'
    when user_month='Ocotober' then '10'
    when user_month='November' then '11'
    when user_month='December' then '12' 
    end user_month,
    case 
    when (user_day is not null or user_day<>'') and (user_month is not null or user_month<>'')   and (user_year is not null or user_year<>'') 
    then  user_day ||'-' || user_month ||'-' || user_year else '' end as dob,
    created,
    status as status,
    uu_id as uuid,
    mobile as mobile,
    changed 
FROM
    auth_user_registration;


我需要将user_dayuser_monthuser_year合并为一列,格式如下(01-01-2022),当前格式为(01-January-2022)。请帮助我完成此操作。

5vf7fwbs

5vf7fwbs1#

首先,我得说你做错了。你应该把日期存储为日期(放入DATE数据类型列中),而不是将天/月/年单独放入它们自己的列中,并且无法控制它。如果您输入'Janiary'呢?这显然是 January,但是-要识别它-您必须将(很大的努力?)或者,为什么不是84?84-Janiary-2022;看起来不太好。
总之:

  • 首先连接这些值
  • 对结果应用to_date函数,格式模型适当
  • 然后使用目标格式模型将to_char应用于该DATE数据类型值
SQL> SELECT user_day,
  2         user_month,
  3         user_year,
  4         TO_CHAR (
  5            TO_DATE (
  6               user_day || '-' || user_month || '-' || user_year
  7                  DEFAULT NULL ON CONVERSION ERROR,
  8               'dd-month-yyyy',
  9               'nls_date_language=english'),
 10            'dd-mm-yyyy') AS dob
 11    FROM auth_user_registration;

USER_DAY   USER_MONTH      USER_YEAR       DOB
---------- --------------- --------------- ----------
05         March           1977            05-03-1977

SQL>

我建议采取以下方法:

SQL> CREATE TABLE auth_user_registration
  2  (
  3     user_id     NUMBER (*, 0),
  4     user_name   VARCHAR2 (200 BYTE),
  5     dob         DATE                       --> DATE datatype
  6  );

Table created.

SQL> INSERT INTO auth_user_registration (user_id, user_name, dob)
  2       VALUES (914981, 'srik1977@gmail.com', DATE '1977-03-05');

1 row created.

SQL> SELECT dob, TO_CHAR (dob, 'dd-mm-yyyy') result FROM auth_user_registration;

DOB      RESULT
-------- ----------
05.03.77 05-03-1977

SQL>

P.S.在使用Oracle时不要使用双引号;他们会带来麻烦。

balp4ylt

balp4ylt2#

您已经有了一个case表达式来将月份名称转换为数字,但是您似乎希望在连接中引用user_month时使用该case的结果,因为您使用了相同名称的别名。您不能在定义列别名的同一查询级别中使用列别名(除非在order-by子句中),因此它仍然引用具有相同名称的原始表列-因此您看到的是月份名称。
你需要把case表达式移到连接中,但是你也拼错了'October',在你的例子中你想要用零填充月份数字;一个简单的case表达式要比一个搜索表达式少输入一些,所以你可以这样做:

SELECT
    user_id as user_id,
    user_name as user_name,
    mail as user_mail,
    fullname as full_name,
    case when (gender='male' or gender='mail' or gender='Male') then 'Male'
    when (gender='female' or gender='Female') then 'Female' else 'Others'
    end as gender,
    case 
    when user_day is not null and user_month is not null and user_year is not null
    then user_day ||'-'
      || case user_month
        when 'January' then '01'
        when 'February' then '02'
        when 'March' then '03'
        when 'April' then '04'
        when 'May' then '05'
        when 'June' then '06'
        when 'July' then '07'
        when 'August' then '08'
        when 'September' then '09'
        when 'October' then '10'
        when 'November' then '11'
        when 'December' then '12' 
      end
      ||'-' || user_year end as dob,
    created,
    status as status,
    uu_id as uuid,
    mobile as mobile,
    changed 
FROM
    auth_user_registration;

| 用户ID|用户名|用户_邮件|全名|性别|出生日期|创建|状态|通用唯一标识符|移动的|变更|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 小行星914981| srik1977@gmail.com | srikes1977@gmail.com|比兰德拉·莫汉|其他|一九七七年三月五日|小行星14124| 1个|编号69945218-CC 7 F-46 F5|小行星947| * 无效 *|
| 小行星916653| mah@gmail.com | mahe@gmail.com|马赫什·德奥恰克|男性|一九八九年七月十八日|小行星1412439| 1个|小行星4563|小行星7709910| * 无效 *|
| 小行星916665| hars@hotmail.com | haveri@hotmail.com|哈尔沙尔·贾韦里|其他|一九九二年五月八日|小行星1412439| 1个|三氟甲磺酸|小行星8568013| * 无效 *|
| 小行星890991| gu1952@gmail.com | gunran1952@gmail.com|苏布拉马尼古纳塞卡兰|男性|一九五○年十月十七日|小行星141235| 1个|6b4c7077-8864-4702-|小行星44697| * 无效 *|
| 小行星891053| amini@gmail.com | amihani@gmail.com|阿米尔·兰詹·达尼|男性|一九九二年八月二十日|小行星141235| 1个|62 dd 0 cb 4-c86 b-4634-巴6|小行星9432880| * 无效 *|
| 小行星89| pringhc0@gmail.com | pravghc0@gmail.com|普拉温·辛格·乔汉|男性|一九九○年四月十日|小行星141235| 1个|037 f1079-数据库85 - 49 d 7| 04663542| * 无效 *|
| 小行星892| badkt@yahoo.com | bammadkt@yahoo.com|穆罕默德·巴舍尔|男性|一九九四年七月五日|小行星14| 1个|10 c 07 ce 7-巴德夫-4204-b2 a9|小行星7232903| * 无效 *|
| 小行星892729| swaar@gmail.com | swnwar@gmail.com|斯瓦普尼勒帕平瓦尔|男性|一九八六年九月八日|小行星14| 1个|2f 8940 ef-3136-425型|小行星98| * 无效 *|
| 小行星896209| raj@yahoo.com | rajan@yahoo.com|拉吉夫·纳扬|男性|一九六九年六月十日|小行星14123| 1个|8008 f636 - 916 b-4982-巴德-|小行星9810769| * 无效 *|
| 四六五|贾伊斯帕里克|jay@gmail.com|杰伊·帕里克|男性|一九八四年一月三十一日|小行星140635958| 1个|编号:c 04 b7129-b 04 e-4ca 5 -9199-|小行星9586817| * 无效 *|
| 四百七十六|斯涅尔|sknr@gmail.com|萨西达兰·奈尔|男性|一九六八年十月二十六日|小行星1406359591| 1个|69288 f05-苯并呋喃-4f5e-9561- 71 e|小行星530154| * 无效 *|
| 小行星504|卡斯蒂费尔|sir@gmail.com|阿迪蒂亚·维尔马|男性|一九九五年十二月二十五日|小行星140635| 1个|阿4 e8 ad 7 b-a5 f8 - 476 b-a779-|小行星742842| * 无效 *|
fiddle
不过请注意,如果您有一个月份名称不在列表中,或者拼写错误,或者使用了不同的(印刷)大小写(例如,全部小写,'january'),那么case表达式将计算为null,所以您可能会以类似84--2022的结果结束,借用Littlefoot的例子。
但是,如Littlefoot所示,转换为日期或从日期转换,或者遵循常规做法,只存储单个日期值而不是三个独立的字符串值,这会更简单,原因已经给出。

相关问题