1Z0-051 QUESTION 6 CASE和DECODE用法

这篇博客主要探讨了Oracle数据库中CASE语句和DECODE函数的使用。文章指出,第二个查询由于语法错误无法成功执行。CASE的详细语法参考了官方文档,而DECODE的用法也在另一份官方文档中进行了说明。
QUESTION 6
Examine the structure of the SHIPMENTS table:
name Null Type
PO_ID NOT NULL NUMBER(3)
PO_DATE NOT NULL DATE
SHIPMENT_DATE NOT NULL DATE
SHIPMENT_MODE VARCHAR2(30)
SHIPMENT_COST NUMBER(8,2)
You want to generate a report that displays the PO_ID and the penalty amount to be paid if the
SHIPMENT_DATE is later than one month from the PO_DATE. The penalty is $20 per day.
Evaluate the following two queries:SQL> SELECT po_id, CASE
WHEN MONTHS_BETWEEN (shipment_date,po_date)>1 THEN
TO_CHAR((shipment_date - po_date) * 20) ELSE 'No Penalty' END PENALTY
FROM shipments;
SQL>SELECT po_id, DECODE
(MONTHS_BETWEEN (po_date,shipment_date)>1,
TO_CHAR((shipment_date - po_date) * 20), 'No Penalty') PENALTY
FROM shipments;
Which statement is true regarding the above commands?
A. Both execute successfully and give correct results.
B. Only the first query executes successfully but gives a wrong result.
C. Only the first query executes successfully and gives the correct result.
D. Only the second query executes successfully but gives a wrong result.

E. Only the second query executes successfully and gives the correct result.

答案:C

解析:

case的语法参考ORACLE官方文档:

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/case_statement.htm

摘要如下:

  SELECT job_id INTO jobid from employees WHERE employee_id = empid;
  CASE
    WHEN jobid = 'PU_CLERK' THEN sal_raise := .09;
    WHEN jobid = 'SH_CLERK' THEN sal_raise := .08;
    WHEN jobid = 'ST_CLERK' THEN sal_raise := .07;
    ELSE sal_raise := 0;
  END CASE;
故,第一条语句执行成功,并返回正确结果。

decode的语法参考ORACLE官方文档:

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions040.htm#SQLRF00631

摘要如下:

SELECT product_id,
       DECODE (warehouse_id, 1, 'Southlake', 
                             2, 'San Francisco', 
                             3, 'New Jersey', 
                             4, 'Seattle',
                                'Non domestic') 
       "Location of inventory" FROM inventories
       WHERE product_id < 1775;

故,第二句语法错误,无法执行。

具体如下:

SQL> --create table
SQL> create table shipments(
  2  po_id number(3) not null,
  3  po_date date not null,
  4  shipment_date date not null,
  5  shipment_mode varchar2(30),
  6  shipment_cost number(8,2));

表已创建。

SQL> insert into shipments values(1,sysdate-2*365,sysdate,'1',23);

已创建 1 行。

SQL> insert into shipments values(2,sysdate-2,sysdate,'2',45);

已创建 1 行。

SQL> insert into shipments values(3,sysdate,sysdate,'3',67);

已创建 1 行。



SQL> select * from shipments;

     PO_ID PO_DATE        SHIPMENT_DATE  SHIPMENT_MODE
---------- -------------- -------------- -----------------------------
SHIPMENT_COST
-------------
         1 28-12月-11     27-12月-13     1
           23

         2 25-12月-13     27-12月-13     2
           45

         3 27-12月-13     27-12月-13     3
           67


SQL> SELECT po_id, CASE
  2  WHEN MONTHS_BETWEEN (shipment_date,po_date)>1 THEN
  3  TO_CHAR((shipment_date - po_date) * 20) ELSE 'No Penalty' END PEN
  4  FROM shipments;

     PO_ID PENALTY
---------- ----------------------------------------
         1 14600
         2 No Penalty
         3 No Penalty

SQL> SELECT po_id, DECODE
  2  (MONTHS_BETWEEN (po_date,shipment_date)>1,
  3  TO_CHAR((shipment_date - po_date) * 20), 'No Penalty') PENALTY
  4  FROM shipments;
(MONTHS_BETWEEN (po_date,shipment_date)>1,
                                       *
第 2 行出现错误:
ORA-00907: 缺失右括号


import os import re import json from datetime import datetime from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.primitives import padding from cryptography.hazmat.backends import default_backend from binascii import hexlify, unhexlify from rest_framework import parsers, renderers from rest_framework.compat import coreapi, coreschema from rest_framework.response import Response from rest_framework.schemas import ManualSchema from rest_framework.views import APIView from rest_framework.authtoken.models import Token from rest_framework.authtoken.serializers import AuthTokenSerializer from django.contrib import auth from django.http import QueryDict from django.shortcuts import HttpResponse from django.views.generic.base import View from django.contrib.auth.hashers import make_password, check_password from .models import * from case.models import CaseType from users.models import ScoreModel from .utils import send_register_email from fcdaserver.rest_framework.views import ViewBase class UserPermissions(ViewBase): def put(self, request): exam_type = request.data.get("exam_type") user = request.user if user.is_active: user.exam_type = exam_type user.save() response_data = {"code": 0, "msg": ""} else: response_data = {"code": 1, "msg": "用户没有激活!"} return self.json_response(data=response_data) class ResetPwd(ViewBase): def post(self, request): old_word = request.data.get("old_pwd", "") new_pwd = request.data.get("new_pwd", "") user = auth.authenticate(username=request.user.username, password=old_word) if user is not None: if user.is_active: user.set_password(new_pwd) user.save() response_data = {"code": 0, "msg": ""} else: response_data = {"code": 1, "msg": "用户未激活!"} else: response_data = {"code": 1, "msg": "用户名或密码错误!"} return self.json_response(data=response_data) class MyAuthToken(APIView): throttle_classes = () permission_classes = () parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,) renderer_classes = (renderers.JSONRenderer,) serializer_class = AuthTokenSerializer if coreapi is not None and coreschema is not None: schema = ManualSchema( fields=[ coreapi.Field( name="username", required=True, location='form', schema=coreschema.String( title="Username", description="Valid username for authentication", ), ), coreapi.Field( name="password", required=True, location='form', schema=coreschema.String( title="Password", description="Valid password for authentication", ), ), ], encoding="application/json", ) def post(self, request, *args, **kwargs): username = request.data.get("username") password = request.data.get("password") user_obj = UserProfile.objects.filter(username=username).first() if user_obj: if not check_password(password, user_obj.password): return Response({"code": 1, "msg": "密码不正确!"}) if user_obj.sn and user_obj.is_active: current_time = datetime.now().timetuple() active_time = user_obj.sn.active_time.timetuple() if int(time.mktime(current_time)) - int(time.mktime(active_time)) > 60 * 60 * 24 * user_obj.sn.expire_date: user_obj.sn.is_valid = False else: user_obj.sn.is_valid = True user_obj.sn.save() if Token.objects.filter(user=user_obj).exists(): token_key = hexlify(os.urandom(20)).decode() Token.objects.filter(user=user_obj).update(key=token_key, created=datetime.now()) token_info = Token.objects.filter(user=user_obj).first() else: token_info = Token.objects.create(user=user_obj) UserProfile.objects.filter(username=username).update(last_login=datetime.now()) if user_obj.sn.is_valid: return Response({"code": 0, "msg": token_info.key}) else: return Response({"code": 1, "msg": "当前账户已过期!请联系管理员!"}) else: return Response({"code": 1, "msg": "用户未激活!请联系管理员!"}) else: return Response({"code": 1, "msg": "用户不存在!"}) class UserRegister(View): def post(self, request, *args, **kwargs): username = request.POST.get("username", "") nickname = request.POST.get("nickname", "") email = request.POST.get("email", "") password = request.POST.get("password", "") serial_number = request.POST.get("serial_number", "") response_data = {"code": 0, "msg": ""} if username == "": response_data = {"code": 2, "msg": "用户名不允许为空!"} elif nickname == "": response_data = {"code": 2, "msg": "昵称不允许为空!"} elif password == "": response_data = {"code": 2, "msg": "密码不允许为空!"} elif email == "": response_data = {"code": 2, "msg": "邮箱不允许为空!"} elif serial_number == "": response_data = {"code": 2, "msg": "序列号不允许为空!"} if response_data["code"] != 0: return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") if not username.isalnum(): response_data = {"code": 3, "msg": "用户名包含非法字符!"} elif re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", email) == None: response_data = {"code": 3, "msg": "邮箱格式不正确!"} if response_data["code"] != 0: return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") if UserProfile.objects.filter(username=username).exists(): response_data = {"code": 1, "msg": "用户名已存在!"} else: serial_number_obj = SerialNumber.objects.filter(serial_number=serial_number).first() if not serial_number_obj or not serial_number_obj.is_valid: response_data = {"code": 2, "msg": "序列号已经过期!"} else: encrypt_pwd = make_password(password, None, 'pbkdf2_sha256') UserProfile.objects.create(username=username, nick_name=nickname, password=encrypt_pwd, email=email, sn=serial_number_obj, is_active=False) serial_number_obj.active_time = datetime.now() serial_number_obj.save() send_register_email(username, email) response_data = {"code": 0, "msg": ""} return HttpResponse(content=json.dumps(response_data, indent=4,), content_type="application/json;charset=UTF-8") class UserActive(View): def post(self, request): email_code = request.POST.get("email_code", "") response_data = {"code": 0, "msg": ""} if email_code == "": response_data = {"code": 2, "msg": "验证码无效"} if response_data["code"] == 0: email_record_obj = EmailVerifyRecord.objects.filter(code=email_code).first() if email_record_obj: user_obj = UserProfile.objects.filter(username=email_record_obj.username, email=email_record_obj.email).first() user_obj.is_active = True user_obj.save() user_group_obj = UserGroup.objects.get(name="默认组") user_group_obj.user.add(user_obj) response_data = {"code": 0, "msg": "用户已激活"} else: response_data = {"code": 2, "msg": "验证码无效"} return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") class UserAuthentication(View): def get(self, request): username = request.GET.get("username") user_obj = UserProfile.objects.filter(username=username).first() if user_obj: response_data = {"code": 0, "msg": "验证码已发送至您的邮箱,请注意查收!"} send_register_email(username, user_obj.email, send_type="reset_pwd") else: response_data = {"code": 1, "msg": "用户不存在"} return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") def post(self, request): username = request.POST.get("username") password = request.POST.get("password") user_obj = UserProfile.objects.filter(username=username).first() if user_obj: if user_obj.is_active: user_obj.set_password(password) user_obj.save() response_data = {"code": 0, "msg": ""} else: response_data = {"code": 1, "msg": "用户未激活!"} else: response_data = {"code": 1, "msg": "用户名或密码错误!"} return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") def put(self, request): put = QueryDict(request.body) username = put.get("username") email_code = put.get("email_code") email_record_obj = EmailVerifyRecord.objects.filter(username=username, code=email_code).first() if email_record_obj: response_data = {"code": 0, "msg": "验证成功!"} else: response_data = {"code": 1, "msg": "验证失败!"} return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") class EditPersonalInformation(ViewBase): def get(self, request): username = request.GET.get("username") user_obj = UserProfile.objects.filter(username=username).first() if user_obj: temp = { "username": username, "nickname": user_obj.nick_name, "email": user_obj.email, "phone": user_obj.first_name } response_data = {"code": 0, "msg": "", "data": temp} else: response_data = {"code": 1, "msg": "用户名获取失败!"} return self.json_response(data=response_data) def post(self, request): username = request.POST.get("username") nickname = request.POST.get("nickname") email = request.POST.get("email") phone = request.POST.get("phone") user_obj = UserProfile.objects.filter(username=username).first() if user_obj: user_obj.nick_name = nickname user_obj.email = email user_obj.first_name = phone user_obj.save() response_data = {"code": 0, "msg": "修改成功!"} else: response_data = {"code": 1, "msg": "用户名获取失败!"} return self.json_response(data=response_data) class ScoreView(ViewBase): def post(self, request): stage_id = request.POST.get("stageId") question_number = request.POST.get("questionNo") score = request.POST.get("score") try: ScoreModel.objects.create(user=request.user, stage_id=stage_id, question_number=question_number, score=score) return self.json_response(data={"code": 0, "msg": "提交成功!"}) except Exception as e: print(e) return self.json_response(data={"code": -1, "msg": "提交失败!"}) def get_key(key): # 确保密钥是字节串类型 if isinstance(key, str): key = key.encode('utf-8') # 填充或截断密钥以确保长度为 16 字节 key = key.ljust(16, b'\x00')[:16] return key def encode2hex(src, key): try: key = get_key(key) cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=default_backend()) encryptor = cipher.encryptor() padder = padding.PKCS7(algorithms.AES.block_size).padder() padded_data = padder.update(src.encode('utf-8')) + padder.finalize() encrypted = encryptor.update(padded_data) + encryptor.finalize() return hexlify(encrypted).decode('utf-8') except Exception as e: print(f"encode2hex fail: {e}") return None def decode4hex(src, key): try: key = get_key(key) cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=default_backend()) decryptor = cipher.decryptor() unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder() encrypted_bytes = unhexlify(src) decrypted = decryptor.update(encrypted_bytes) + decryptor.finalize() decrypted_padded = unpadder.update(decrypted) + unpadder.finalize() return decrypted_padded.decode('utf-8') except Exception as e: print(f"decode4hex fail: {e}") return None class CheckIdCard(View): def post(self, request): id_card = request.POST.get("id_card", "") if id_card == "": response_data = {"code": 2, "msg": "参数无效!"} return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") id_card = decode4hex(id_card, "loginqwert@12345") user_obj = UserProfile.objects.filter(id_card=id_card).first() if user_obj and id_card: if user_obj.is_active: if Token.objects.filter(user=user_obj).exists(): token_key = hexlify(os.urandom(20)).decode() Token.objects.filter(user=user_obj).update(key=token_key, created=datetime.now()) token_info = Token.objects.filter(user=user_obj).first() else: token_info = Token.objects.create(user=user_obj) UserProfile.objects.filter(username=user_obj.username).update(last_login=datetime.now()) if user_obj.sn.is_valid: response_data = {"code": 0, "msg": "", "token": token_info.key, "username": user_obj.username} else: response_data = {"code": 1, "msg": "当前账户已过期!请联系管理员!"} else: response_data = {"code": 1, "msg": "用户未激活!"} else: response_data = {"code": 1, "msg": "此用户不存在!"} return HttpResponse(content=json.dumps(response_data, indent=4, ), content_type="application/json;charset=UTF-8") 逐行解析
最新发布
05-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值