AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 127205
Accepted
Nad
Nad
Asked: 2016-01-26 03:02:44 +0800 CST2016-01-26 03:02:44 +0800 CST 2016-01-26 03:02:44 +0800 CST

根据要求不正确的查询过滤器

  • 772

我的要求完全取决于QUERY.

我在过滤我的 gridview 的基础上three parameters。

  1. Project_name(始终需要)
  2. Date(不总是)
  3. Vehicle_No(不总是)

那么,我的要求是,

使用project_name任何一个都可以用于过滤我的 gridview。

目前我的调试查询对任何两个参数都工作得很好。

以下是我的调试查询:-

SELECT DISTINCT sv.mkey, vehicle_no,
               TO_CHAR (date_in, 'dd-MM-yyyy')
            || ' & '
            || time_in vehicleindate_time,
               TO_CHAR (date_out, 'dd-MM-yyyy')
            || ' & '
            || time_out vehicleoutdate_time,
            gate_no_in || ' & ' || gate_no_out ingate_outgateno,
            gd.good_type goods_type, net_weight netweight,
               TO_CHAR (challan_date, 'dd-MM-yyyy')
            || ' & '
            || challan_no challandate_no,
            remark_in remarkin, NULL receipt_no, date_in
       FROM xxcus.xxgid_supinv sv,
            xxcus.xx_supinv_goodtype gd,
            xxcus.xxacl_xxgid_user_mst ms
      WHERE (gd.good_type_code(+) = sv.good_type)
        AND (       sv.project_id = '1368'
                AND TO_CHAR (date_in, 'dd-MM-yyyy') = '26-11-2015'
             OR vehicle_no = '0'
            )
        AND sv.delete_flag = 'N'
   ORDER BY date_in DESC, vehicle_no

上面的查询显示了我输入的确切project_name结果Date。

但是当我添加第三个参数时说它Vehicle_no没有显示准​​确的数据,vehicle_no它仍然显示我寻找2参数的相同数据。

我正在使用 Oracle 作为数据库。

无法使用的最新更新

我对如何处理查询感到困惑,因为 Balazs 的解决方案在我选择 , Project_name,Date然后vehicle_no(不是必需的)时运行良好。Project_name但是当我首先选择, 和时,它并没有得到正确的结果Vehicle_no。任何猜测为什么?

问题是当我只过滤时Project_namedate_columnVehicle_no值出现,0所以它没有显示任何行,这是不正确的,因为我有数据Project_name和Vehicle_no。

我对Balaz's下面的解决方案使用了第二个查询

WHERE (gd.good_type_code(+) = sv.good_type)
    AND (       sv.project_id = '1368'
            AND TO_CHAR (date_in, 'dd-MM-yyyy') = '26-11-2015'
         AND vehicle_no = decode(:vehicle_no, '0', vehicle_no, :vehicle_no)
        )
oracle
  • 3 3 个回答
  • 661 Views

3 个回答

  • Voted
  1. Best Answer
    Lalit Kumar B
    2016-02-03T22:42:56+08:002016-02-03T22:42:56+08:00

    问题在于以下绑定变量替换:

    AND ( sv.project_id                 = DECODE(:'  1368','0', project_id, :'1368')
    AND TO_CHAR (date_in, 'dd-MM-yyyy') = DECODE(:'  ', '0', date_in, :'  ')
    AND vehicle_no                      = DECODE(:'  GJ-06-0Z-9202', '0', vehicle_no, :'  GJ-06-0Z-9202') )) 
    

    您的应用程序应该正确地将值传递给绑定变量。您需要使用的查询是:

    AND sv.project_id = DECODE(:project_id, 0, project_id, :project_id) 
    AND date_in       = DECODE(:date_in, 0, date_in, :date_in) 
    AND vehicle_no    = DECODE(:vehicle_no, 0, vehicle_no, :vehicle_no)
    

    上面的DECODE就像一个IF-ELSE结构。这意味着,如果传递的值为0,则使用表中的列值,否则,使用传递的值。

    您的应用程序需要为以下绑定变量赋值:

    • :project_id
    • :date_in
    • :vehicle_no

    例如,在SQL*Plus中:

    SQL> var num number
    SQL> exec :num := 10
    
    PL/SQL procedure successfully completed.
    
    SQL> print num
    
           NUM
    ----------
            10
    
    SQL> var text varchar2(10)
    SQL> exec :text := 'coder'
    
    PL/SQL procedure successfully completed.
    
    SQL> print text
    
    TEXT
    --------------------------------
    coder
    

    此外,无需为DATE使用TO_CHAR。将值作为DATE传递。否则,在右侧的文字上使用TO_DATE 。保持日期不变,因为您应该比较日期而不是字符串。TO_CHAR 将日期转换为所需格式的字符串。您只需要 TO_CHAR 来显示日期,而不是在比较或日期算术时。

    更新:

    您的应用程序应该正确地将值传递给绑定变量。传递值后,您的查询仍然具有绑定变量 symbol :。

    :'1368'

    如果您捕获绑定变量值,那么它应该只是:

    '1368'

    此外,在价值上有领先的空间。虽然,它不会抛出任何错误,但它会给你不正确的输出。

    • 3
  2. Balazs Papp
    2016-01-26T03:06:53+08:002016-01-26T03:06:53+08:00

    如果您想根据 限制结果集vehicle_no,请使用AND而不是OR。

     WHERE (gd.good_type_code(+) = sv.good_type)
            AND (       sv.project_id = '1368'
                    AND TO_CHAR (date_in, 'dd-MM-yyyy') = '26-11-2015'
     --->        OR vehicle_no = '0'
                )
    

    你可以使用这样的东西,虽然我不喜欢这样的代码:

     WHERE (gd.good_type_code(+) = sv.good_type)
            AND (       sv.project_id = '1368'
                    AND TO_CHAR (date_in, 'dd-MM-yyyy') = '26-11-2015'
                 AND vehicle_no = decode(:vehicle_no, '0', vehicle_no, :vehicle_no)
                )
    

    您也可以对其他参数使用上述小技巧。

    WHERE (gd.good_type_code(+) = sv.good_type)
        AND (
             sv.project_id = decode(:project_id, '0', project_id, :project_id)
             AND TO_CHAR (date_in, 'dd-MM-yyyy') = decode(:date_in, '0', date_in, :date_in)
             AND vehicle_no = decode(:vehicle_no, '0', vehicle_no, :vehicle_no)
            )
    

    以 开头:的变量是绑定变量,所以这是您绑定实际值的地方。

    这是非常糟糕的做法:

    TO_CHAR (date_in, 'dd-MM-yyyy') = '26-11-2015'
    

    您应该比较相同的数据类型。如果必须转换不同的数据类型,转换常量或绑定变量会更好。date_in由于 conversino ,以上内容阻止了在列上使用常规索引。像这样做:

    date_in = to_date('26-11-2015', 'dd-MM-yyyy')
    
    • 2
  3. Nad
    2016-02-04T04:29:41+08:002016-02-04T04:29:41+08:00

    在对逻辑进行了如此多的思考之后,OPERATORS我所做的就是

    首先,我在我的代码中创建了一个简单string的代码,如下所示

    string date = txtdatefilter.Text;

    我将在其中分配date文本框的值。

    我的主要问题是,我无法解码我的date价值观。所以我检查了我的C#代码中的条件,如下所示:-

    if (date == "")
        {
    
            // Query if date was not added [Only difference was **OR** operator] here
        }
    
        else
        {
            //// Query if date was not added [Only difference was **AND** operator here]
        }
    

    查询是

    if (date == "")
        {
    
            strquerry = "SELECT DISTINCT sv.mkey, vehicle_no, TO_CHAR (date_in, 'dd-MM-yyyy') || ' & ' || time_in vehicleindate_time, TO_CHAR (date_out, 'dd-MM-yyyy') || ' & ' " +
                     "|| time_out vehicleoutdate_time, gate_no_in || ' & ' || gate_no_out ingate_outgateno, gd.good_type goods_type, net_weight netweight, TO_CHAR (challan_date, 'dd-MM-yyyy') " +
                     "|| ' & ' || challan_no challandate_no,remark_in remarkin, NULL receipt_no, date_in FROM xxcus.xxgid_supinv sv, xxcus.xx_supinv_goodtype gd, " +
                     "xxcus.xxacl_xxgid_user_mst ms WHERE (gd.good_type_code(+) = sv.good_type) " +
                     "AND(sv.project_id = '" + cmbProjectName.SelectedValue + "'  AND TO_CHAR (date_in, 'dd-MM-yyyy') = '" + txtdatefilter.Text + "' " +
                     "OR vehicle_no = decode('" + ddlVehicleno.SelectedValue + "', '0', vehicle_no, '" + ddlVehicleno.SelectedValue + "')) AND sv.delete_flag = 'N' ORDER BY date_in DESC, vehicle_no";
        }
    
        else
        {
            strquerry = "SELECT DISTINCT sv.mkey, vehicle_no, TO_CHAR (date_in, 'dd-MM-yyyy') || ' & ' || time_in vehicleindate_time, TO_CHAR (date_out, 'dd-MM-yyyy') || ' & ' " +
                    "|| time_out vehicleoutdate_time, gate_no_in || ' & ' || gate_no_out ingate_outgateno, gd.good_type goods_type, net_weight netweight, TO_CHAR (challan_date, 'dd-MM-yyyy') " +
                    "|| ' & ' || challan_no challandate_no,remark_in remarkin, NULL receipt_no, date_in FROM xxcus.xxgid_supinv sv, xxcus.xx_supinv_goodtype gd, " +
                    "xxcus.xxacl_xxgid_user_mst ms WHERE (gd.good_type_code(+) = sv.good_type) " +
                    "AND(sv.project_id = '" + cmbProjectName.SelectedValue + "'  AND TO_CHAR (date_in, 'dd-MM-yyyy') = '" + txtdatefilter.Text + "' " +
                    "AND vehicle_no = decode('" + ddlVehicleno.SelectedValue + "', '0', vehicle_no, '" + ddlVehicleno.SelectedValue + "')) AND sv.delete_flag = 'N' ORDER BY date_in DESC, vehicle_no";
        }
    

    我想通过创建一个函数来做到这一点,但我更喜欢我的C#代码。

    那解决了我的查询

    任何比这更好的答案都将受到欢迎

    • 1

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve