【问题标题】:Multiple input value for single field - PLSQL单个字段的多个输入值 - PLSQL
【发布时间】:2021-07-13 07:43:41
【问题描述】:

我在 PLSQL 中创建了一个查询来从表中搜索客户记录。但仍然有一些限制。在 &CUSTOMER_ID 搜索字段中如果我输入 IN% OR DL100056* 它将搜索以 IN 开头的所有详细信息或给出确切的 DL 详细信息作为输出。我想在客户 ID 字段中搜索多个值,我想同样搜索 DL100056、DL1000365、DL1000652。但我当前的查询没有给出多个输出。


SELECT 
DISTINCT CUSINFO.CUSTOMER_ID AS DEALER_CODE,
CUSINFO.name AS DEALER_NAME,
CUSINFO.CORPORATE_FORM AS FORM_OF_BUSINESS,
C.corporate_form_desc AS FORM_OF_BUSINESS_DESCRIPTION,
ifsapp.Customer_Info_Address_Api.Get_Address1(CUSINFO.customer_id,1) "ADDRESS 1",
ifsapp.Customer_Info_Address_Api.Get_Address2(CUSINFO.customer_id,1) "ADDRESS 2",
CREDTIN.credit_limit AS CREDIT_LIMIT,
CREDTIN.allowed_due_amount AS ALLOWED_DUE_AMOUNT,
CREDTIN.allowed_due_days AS ALLOWED_DUE_DAYS,
ORDERC.salesman_code AS SALESMAN_CODE,
BDA.name AS SALESMAN_NAME,
ORDERC.discount AS DISCOUNT,
(select LISTAGG(c.value,' / ') within group (order by c.value) from ifsapp.COMM_METHOD c 
 where c.method_id_db='PHONE' and c.identity=CUSINFO.customer_id ) "Phone",
(select LISTAGG(c.value,' / ') within group (order by c.value) from ifsapp.COMM_METHOD c 
 where c.method_id_db='MOBILE' and c.identity=CUSINFO.customer_id) "Mobile",
 (select LISTAGG(c.value,' / ') within group (order by c.value) from ifsapp.COMM_METHOD c 
where c.method_id_db='FAX' and c.identity=CUSINFO.customer_id) "Fax",
CUSINFO.identifier_reference as IDENTIFIER_REFERENCE


FROM
ifsapp.CUSTOMER_INFO CUSINFO
LEFT JOIN
ifsapp.CUSTOMER_INFO_ADDRESS CUSADD ON CUSINFO.customer_id=CUSADD.customer_id
LEFT JOIN
ifsapp.CUSTOMER_INFO_CONTACT CUSCONT ON CUSINFO.customer_id=CUSCONT.customer_id
LEFT JOIN
ifsapp.CUSTOMER_CREDIT_INFO_CUST CREDTIN ON CUSINFO.customer_id=CREDTIN.identity
LEFT JOIN
ifsapp.CUST_ORD_CUSTOMER_ENT ORDERC ON CUSINFO.customer_id=ORDERC.customer_id
LEFT JOIN
ifsapp.Comm_Method COMM ON CUSINFO.customer_id=COMM.customer_id
LEFT JOIN
ifsapp.CORPORATE_FORM C ON CUSINFO.corporate_form=C.CORPORATE_FORM
LEFT JOIN
ifsapp.SALES_PART_SALESMAN_LOV BDA ON ORDERC.salesman_code=BDA.salesman_code

WHERE CUSINFO.CUSTOMER_ID LIKE '&CUSTOMER_ID'

【问题讨论】:

  • 您的问题中没有 PL/SQL。
  • PL/SQL Developer 和 SQL Developer 是桌面应用程序。除非您对它们的工作方式有特定问题,否则请不要标记它们。

标签: sql oracle


【解决方案1】:

这样不行;一种选择是使用这样的查询(我没有您的表,所以我使用 Scott 的DEPT):它将参数值(用逗号分隔)拆分为行并将它们用作子查询。因此,您需要的是第 3 - 5 行(根据您的表/列名称调整)。

SQL> select deptno, dname, loc
  2  from dept
  3  where deptno in (select to_number(regexp_substr('&&par_deptno', '[^,]+', 1, level))
  4                   from dual
  5                   connect by level <= regexp_count('&&par_deptno', ',') + 1
  6                  )
  7  order by deptno;
Enter value for par_deptno: 10

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK

SQL> undefine par_deptno
SQL> /
Enter value for par_deptno: 20,40

    DEPTNO DNAME          LOC
---------- -------------- -------------
        20 RESEARCH       DALLAS
        40 OPERATIONS     BOSTON

SQL>

【讨论】:

  • 非常感谢..WHERE CUSINFO.CUSTOMER_ID IN (select to_number(regexp_substr('&amp;&amp;CUSTOMER_ID', '[^,]+', 1, level)) from dual connect by level &lt;= regexp_count('&amp;&amp;CUSTOMER_ID', ',') + 1)
  • 它说无效号码
  • 它不适合我(如您所见)。我没有你的表,但是 - 看起来如果你删除 TO_NUMBER 可能没问题(如果 CUSTOMER_ID 是 VARCHAR2 列并且也包含字母)。
【解决方案2】:
  1. 请更好地格式化你的sql,如果它不可读,很难理解查询背后的逻辑。

  2. 您可以尝试使用 LIKE 'DL%'。这将查找所有以 DL 开头的字符串。另一种解决方案,如果代码不总是以“DL”开头,则在代码上使用子字符串来获取前几个字符,然后添加“%”

希望这有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    相关资源
    最近更新 更多