在sql中实现多条件任意组合黑名单的方法

author author     2022-07-31     533

关键词:

    最近的一个项目中,在对故障工单进行自动语音督办的时候,需要在某个时段对某种组合条件下的工单不督办。如在实时督办中,对所有区域告警ID为“FF--1057361341”工单,白天不督办,但夜间需督办;在受理督办中,对某个指定区域告警ID为“207-121-00-800316”的,白天督办,夜间无需督办。

    为了保障督办的及时性,我们采用的是任务驱动的方式。即生成任务,根据任务去判定采用什么督办模式。如下图:

技术分享                       

    那么为了实现某个时段对某种组合条件下的工单不督办的功能,我们只需要在生成督办任务后,逐个判断是否满足条件A,B,C,如下图。但每次增加一个条件的时候,我们都必须修改和发布系统。同时判断条件很多时,效率极其低下。

 技术分享

    于是,我们想到了“黑名单”,把某种特定的条件组合,设计成“黑名单”。我们只需要判断此工单是否在黑名单中,如果在,则不督办,如下图。但对于不同的组合条件,需要设计不同的黑名单表,且没增加一种条件时,需要修改和发布系统。

 技术分享

    那么,怎么才能实现一个黑名单,能够满足不同组合条件的变化情况。我们设计以下黑名单表BlackList。

字段

类型

说明

F_Id

int

自动编号

F_Area

Varchar(50)

区域名称

F_ClassID

int

督办类别ID

F_TimeSlot

Int

督办时间段

F_Mark

Varchar(100)

网管告警ID

F_Grede

Varchar(100)

处理级别

F_Class1

Varchar(100)

一级分类

F_Class2

Varchar(100)

二级分类

F_Class3

Varchar(100)

三级分类

      然后,我们提供一个Get_isDoBlackList函数,用于判定此任务工单是否存在于黑名单表中,如果存在0,否则返回1,代码如下:   

技术分享
--创建判断黑名单的函数
create function [MM].[dbo].[Get_isDoBlackList]
(
@Area varchar(50),    --区域
@ClassID int,         --督办类型编号
@TimeSlot int,        --执行时间段,白天(-23点)为1,夜间为2;
@Grade varchar(50),   --工单级别
@Mark varchar(50),    --告警ID
@Class1 varchar(50),  --一级分类
@Class2 varchar(50),  --二级分类
@Class3 varchar(50)   --三级分类
)
/*
功能描述:查询当前需要督办的任务工单是否在黑名单表BlackList中有配置,
      如果有就返回,否则返回
创建者:ldh
创建时间:2016/6/30
*/
returns int
as
begin
  declare @rt int

  if not exists( select F_mark from dbo.BlackList 
     where (F_Area=@Area or F_Area=all) and (F_ClassID=@ClassID or F_ClassID=0) and (F_Grade=@Grade or F_Grade=all)  
         and (F_MARk=@Mark or F_MARk=all)  and  F_TimeSlot=@TimeSlot and (F_Class1=@Class1 or F_Class1=all) 
           and (F_Class2=@Class2 or F_Class2=all) and (F_Class3=@Class3 or F_Class3=all) )
  begin
    set @rt= 1   
  end
  else
  begin
    set @rt= 0
  end 
  return @rt 
end
View Code

     这样,我们只需要设置BlackList中的记录,根据记录中的值来判定是否启用此字段为条件。对于int型字段,当设置为0时,表示适应所有条件,即忽略此判定条件,否则,设置到此字段的值作为判断条件。对于Varchar类型的字段,all表示适应所有规则,即忽略此判定条件,否则,设置到此字段的值作为判断条件。当然,前提是我们知道不会出现0和all值。

    我么根据以下代码来验证我们的方法和思路:

1)设置黑名单记录

技术分享
--设置黑名单记录
INSERT INTO [IVR].[dbo].[t_r_EomsBlackList]([F_Area],[F_ClassID],[F_TimeSlot],
              [F_Grade],[F_Mark],[F_Class1],[F_Class2],[F_Class3])
select all,2,2,all,208-069-00-300008,all,all,all
union
select all,2,2,all,208-121-00-800030,all,all,all
union
select all,2,2,all,207-121-00-800316,all,all,all
union
select all,1,1,all,FF--1057361341,all,all,all
View Code

2)调用方法判定是否为黑名单

技术分享
if (IVR.dbo.Get_isDoBlackList(11,2,2,二级督办,207-121-00-800316,a11a,a11a,123)=0)
begin
  print 是黑名单,需要过滤,不督办
end
else
begin
  print 不是黑名单,无需过滤,督办
end
*/
View Code

    通过这种方法,我们可以实现通过设置一条记录,来增加一种组合条件的判定条件,从而在某个时段对某种组合条件下的工单不督办。
    如有更好的方法,欢迎探讨和指导。(不经允许,请勿转载)

 

在python中实现多分支选择结构的较好方法是

参考技术A(A.ifB.if-elseC.if-elif-else)。C8.下列语句执行后的输出是(if2:)。CD.if嵌套)。DB.notx)。DB.x-6>5B.2<xandx<=10D... 查看详情

如何在gridview中实现多选

GridView实现跨页多选,参考如下:JS前台://GridView中实现多选效果function CheckAllC(oCheckbox)     var GridView1 = document.getElementById(\'gvDataList\');    for (i = 1; i < gvDataList.rows.length; i++)         GridView1.rows[i].cells[0].getEleme... 查看详情

如何在 PostgreSQL 中实现多对多关系?

】如何在PostgreSQL中实现多对多关系?【英文标题】:Howtoimplementamany-to-manyrelationshipinPostgreSQL?【发布时间】:2012-04-0502:14:21【问题描述】:我相信标题是不言自明的。如何在PostgreSQL中创建表结构以建立多对多关系。我的例子:Pro... 查看详情

如何在 laravel 护照中实现多身份验证

】如何在laravel护照中实现多身份验证【英文标题】:howtoimplementmultiauthinlaravelpassport【发布时间】:2018-09-0120:51:57【问题描述】:我有两个用户admin/user我想验证这两个用户的api,它适用于一个用户,但不适用于管理员看看我尝试... 查看详情

在 MFC 中实现多线程以更新外部函数可访问的内部字典

】在MFC中实现多线程以更新外部函数可访问的内部字典【英文标题】:ImplementingMultithreadinginMFCtoupdateaninternaldictionaryaccessiblebyoutsidefunctions【发布时间】:2011-12-2017:54:15【问题描述】:我正在使用C++和MFC创建一个应用程序,该应用... 查看详情

请问如何在delphi中实现多选打印功能!

参考技术A标签打印请问如安在delphi中实现多选打印功能!具体的情况是:DBgrid傍边有很多字段,有很多记录请求做到:第一步,记录的若干是动态的,但要能选择记录打印,数量不限。第二步,字段有很多,再上一步的基本上... 查看详情

如何在 Firebase 身份验证中实现多用户帐户登录和切换?

】如何在Firebase身份验证中实现多用户帐户登录和切换?【英文标题】:HowdoIwantimplementmultipleuseraccountloginandswitchinginFirebaseAuthentication?【发布时间】:2018-05-0713:08:55【问题描述】:在GmailAndroid应用中,您可以在用户帐户视图上滑... 查看详情

使用消息传递接口在 Python 中实现多处理 [关闭]

】使用消息传递接口在Python中实现多处理[关闭]【英文标题】:ImplementmultiprocessinginPythonwithamessagepassinginterface[closed]【发布时间】:2021-03-1204:49:55【问题描述】:我正在尝试将一些JavaScript代码转换为Python,但是JavaScript以异步方式... 查看详情

在 iPad App 中实现多用户聊天

】在iPadApp中实现多用户聊天【英文标题】:ImplementingmultiuserchatiniPadApp【发布时间】:2015-06-1717:04:05【问题描述】:我有一个iPad应用程序。我打算给它添加一个群聊功能。这意味着1)用户可以创建或加入群组2)可以向其他登录该... 查看详情

java示例代码_在Java中实现多线程池

java示例代码_在Java中实现多线程池 查看详情

我可以使用优化实验在 Anylogic 中实现多目标优化问题吗?

】我可以使用优化实验在Anylogic中实现多目标优化问题吗?【英文标题】:CanIimplementamultiobjectiveoptimizationprobleminAnylogicusingoptimizationexperiment?【发布时间】:2021-02-1517:06:14【问题描述】:我正在尝试在Anylogic中使用基于Anylogic代理... 查看详情

java中实现多线程的两种方式(代码片段)

Java中对于对于多线程的实现主要提供了两种方法继承Thread()类实现Runnable接口接下来从这两个方面进行说明相关知识。继承Thread()类写一个类直接继承Thread()类,然后重写Thread()类的run()方法,调用其start()方法即可启动线程... 查看详情

如何在 C 中实现多分支树结构

】如何在C中实现多分支树结构【英文标题】:HowtoimplementamultibranchtreestructureinC【发布时间】:2011-08-2713:14:14【问题描述】:我很久没有用C写代码了。我正在尝试做一棵多叶树。我正在尝试将C#trie实现转换为C,以便使用CUDA在GPU... 查看详情

我应该如何在角度材料中实现多项选择选项?

】我应该如何在角度材料中实现多项选择选项?【英文标题】:HowamIsupposedtoimplementmultipleselectoptioninangular-material?【发布时间】:2015-04-2317:22:12【问题描述】:我已经检查了文档和演示,但是唉!!我还没有找到任何关于使用angul... 查看详情

如何在angular js中实现多路由

】如何在angularjs中实现多路由【英文标题】:Howtoachievemultipleroutinginangularjs【发布时间】:2018-11-2223:10:07【问题描述】:我在AngularJS中练习routing。到目前为止,我已经研究了2页路由,但现在我想实现3页路由。(function()\'usestrict\';... 查看详情

如何使用 Java Spring 在 MySql 中实现多租户 [关闭]

】如何使用JavaSpring在MySql中实现多租户[关闭]【英文标题】:HowcanIachievemultitenancyinMySqlbyusingJavaSpring[closed]【发布时间】:2018-02-2605:13:48【问题描述】:如何使用MySqlJavaSpring最佳实践实现多租户,并建议使用任何其他数据库代替MyS... 查看详情

系统运维系列之java中实现多线程的方式补充

1介绍接本专题博客之系统运维系列之java中实现多线程的方式上篇博客提到多线程使用的4种方式,分别是:实现方式1:继承Thread类,重写该类的run方法;实现方式2:实现Runnable接口,并重写该接口的run... 查看详情

使用一条sql语句进行不同的搜索组合

...-05-0113:15:12【问题描述】:我是SQL新手,我在我的Java程序中实现了这个搜索方法,它从1到5个文本字段中获取搜索输入并搜索满足搜索条件的对象。4个数据库列在一个表中,但1个在另一个表中,我可以在搜索中加入。问题是这... 查看详情