天道酬勤,学无止境

How to prevent an procedure similar to the split () function (but with multiple separators) returns ' ' in its output

guys, I'm a programming newbie trying to improve the procedure bellow in a way that when I pass it this argument: split_string("After the flood ... all the colors came out."," .") it returns it:

['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out']

and not this:

['After', 'the', 'flood', '', '', '', '', 'all', 'the', 'colors', 'came', 'out', ''] 

Any hint of how to do this? (I could just iterate again the list and delete the '' elements, but I wanted a more elegant solution)

This is the procedure:

def split_string(source, separatorList):
    splited = [source]
    for separator in splitlist:
        source = splited
        splited = []
        print 'separator= ', separator
        for sequence in source:
            print 'sequence = ', sequence
            if sequence not in splitlist and sequence != ' ':
                splited = splited + sequence.split(separator)            
    return splited

print split_string("This is a test-of the,string separation-code!", " ,!-")
print
print split_string("After  the flood   ...  all the colors came out."," .")
标签

评论

You can filter out the empty strings in the return statement:

return [x for x in split if x]

As a side note, I think it would be easier to write your function based on re.split():

def split_string(s, separators):
    pattern = "|".join(re.escape(sep) for sep in separators)
    return [x for x in re.split(pattern, s) if x]

print re.split('[. ]+', 'After the flood ... all the colors came out.')

or, better, the other way round

print re.findall('[^. ]+', 'After the flood ... all the colors came out.')

Let's see where did the empty strings come from first, try to execute this in shell:

>>> 'After the'.split(' ')

result:

['After', '', 'the']

This was because when split method came to ' ' in the string, it find nothing but '' between two spaces.

So the solution is simple, just check the boolean value of every item get from .split(

def split_string(source, separatorList):
    splited = [source]
    for separator in separatorList:
        # if you want to exchange two variables, then write in one line can make the code more clear
        source, splited = splited, []
        for sequence in source:
            # there's no need to check `sequence` in advance, just split it
            # if sequence not in separatorList and sequence != ' ':
                # splited = splited + sequence.split(separator)

            # code to prevent appearance of `''` is here, do a if check in list comprehension.
            # `+=` is equivalent to `= splited +`
            splited += [i for i in sequence.split(separator) if i]
    return splited

More details about [i for i in a_list if i] see PEP 202

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 将您的SQL Server工作负载迁移到PostgreSQL –第2部分
    目录 SQL Server vs PostgreSQL 并发控制 SQL Server并发控制 PostgreSQL并发控制 数据库结构 T-SQL与PL/pgSQL PostgreSQL具有更完善的SQL语法 对象名称区分大小写 数据库对象/特征 数据类型 内置功能和运算符 SQL语言差异 CTE性能差异 Collation / Ordering 当删除不删除时 PostgreSQL有优势的地方 PostgreSQL实际上可以在任何地方运行 将测试数据插入PostgreSQL表很容易 PostgreSQL中的多语言支持 PostgreSQL具有丰富的函数和运算符集 PostgreSQL对CSV有更好的支持 您可以使用单个语句在PostgreSQL中删除整个模式 Unicode 和字符编码基础 Unicode支持 SQL Server有优势的地方 您不能在单个查询中直接查询多个数据库 您不能直接在PostgreSQL中执行过程代码 PostgreSQL 不支持版本11之前的存储过程 PostgreSQL在版本12之前不支持计算列 SQL Server vs PostgreSQL 要进行高层次的比较,请在此处 查看此数据库引擎页面。 并发控制 行数据的并发控制是数据库系统的重要方面,它决定了行数据的维护和更新效率。不同的数据库系统具有不同的并发控制机制,这些机制直接影响其性能。
  • MySQL面试题(python版本)
    Python操作MySQL步骤 import pymysql # 创建连接对象 conn = pymysql.connect(host="", port=3306, user="root", password="123456", database="demo", charset="utf8") # 建立游标 cur = conn.cursor() # 查询SQL语句 sql = "select * from user" # 执行语句 count = cur.execute(sql) # 获取结果 one_ret = cur.fetchone() # 获取一条 for ret in cur.fetchall() # 获取所有 print(ret) # 增删改 # 将修改提交倒数据库 conn.commit() # 异常回滚 conn.rollback() # 关闭游标 cur.close() # 关闭连接 conn.close() SQL的select语句完整的执行顺序 (1) FROM (2) JOIN/OUTER … ON (3)WHERE (4)GROUP BY (5)WITH (6)HAVING (7)SELECT (8)DISTINCT/ORDER BY 每个步骤执行的时候都会产生一个虚表,该虚表被作用为下一个步骤的输入,只有最后一步生成的表才会返回给调用者
  • 为一个 SQL 参数传递多个值(Passing multiple values for one SQL parameter)
    问题 我有一个 CheckBoxList,用户可以在其中从列表中选择多个项目。 然后我需要能够将这些值传递给我的存储过程,以便它们可以在 WHERE 条件中使用,例如: WHERE ID IN (1,2,3) 我尝试这样做,使其成为 nvarchar 参数,并使用以下命令传递字符串1,2,3 : WHERE ID IN (@IDs) 但这返回了以下错误: Conversion failed when converting the nvarchar value '1,2,3' to data type int 任何帮助将非常感激! 回答1 有几种方法可以做到。 您可以将参数作为 XML blob 传入,如下例所示: CREATE PROCEDURE [dbo].[uspGetCustomersXML] @CustomerIDs XML AS BEGIN SELECT c.ID, c.Name FROM [dbo].[Customer] c JOIN @CustomerIDs.nodes('IDList/ID') AS x(Item) ON c.ID = Item.value('.', 'int' ) END GO --Example Use: EXECUTE [dbo].[uspGetCustomersXML] '<IDList><ID>1</ID><ID>10</ID><ID
  • 使用 IN 子句更新 SQL Server 中的多行(Update multiple rows in SQL Server with IN clause)
    问题 我有一个这样的存储过程: CREATE PROCEDURE Resume @UserID nvarchar(100) AS BEGIN SET NOCOUNT ON; update Candidate set Approved = 'y' where UserId_I in (@UserID) END GO 在此@UserID为字符串格式。 我从代码作为字符串发送参数@UserID的值是1,2,3 。 我有错误 将 nvarchar 值“1,2,3”转换为数据类型 int 时转换失败。 请解决这个问题 回答1 尝试使用比子查询性能更好的临时表 DECLARE @userIds NVARCHAR(MAX) SET @userIds ='1,2,3,4,5,6' CREATE table #TempUser ( userId Int ) DECLARE @SplitOn VARCHAR(1) SET @SplitOn = ',' While (Charindex(@SplitOn,@userIds)>0) Begin Insert Into #TempUser (userId) Select userId = ltrim(rtrim(Substring(@userIds ,1,Charindex(@SplitOn,@userIds )-1))) Set @userIds =
  • 一列中有多个值的SQL查询(SQL Query with multiple values in one column)
    问题 我一直在桌子上敲我的头,试图弄清楚这一点。 我有一个表格,用于存储工作信息以及工作未完成的原因。 原因有数字、01、02、03等。 待处理工作可能有两个原因。 如果您选择两个原因,它们将存储在同一列中,用逗号分隔。 这是JOBID表中的一个示例: Job_Number User_Assigned PendingInfo 1 user1 01,02 还有另一个名为Pending 的表,用于存储这些值实际代表的内容。 01=信息不足,02=时间不够,03=等待审核。 例子: Pending_Num PendingWord 01 Not Enough Info 02 Not Enough Time 我想要做的是查询数据库以提供所有工作编号、用户、待处理信息和待处理原因。 我可以打破第一个值,但无法弄清楚如何做第二个。 到目前为止,我的技能有限: select Job_number,user_assigned,SUBSTRING(pendinginfo,0,3),pendingword from jobid,pending where SUBSTRING(pendinginfo,0,3)=pending.pending_num and pendinginfo!='00,00' and pendinginfo!='NULL' 对于这个例子,我想看到的是: Job_Number User
  • 将mysql值拆分为未知数量的部分(Splitting mysql value into unknown number of parts)
    问题 我已获得一个mySQL数据库,以将其重组为OpenCart安装。 我收集了大部分数据,但在旧站点中,“产品类别”已全部放在一个列中 |228|243|228|239|228| 或|88| 或|88|243| 因此,我不知道任何特定记录中有多少个。 我不想使用php函数来提取数据,因为我正在使用SQL查询将数据手动提取到新数据库中。 更为复杂的是,我必须在products_to_categories中为该列中的每个值创建新行-我不介意执行多步过程,我不希望通过单个查询来执行此操作-我希望避免重新输入-输入所有数据。 我知道这类似于MySQL Split String,但我不认为它是重复项,因为它不能完全回答我的问题,因为列中可能有任意数量的值-不只是2。 [编辑]我尝试了common_schema,但以目前的技能水平,我很难获得想要的结果,但是以后肯定会使用它。 作为记录,这是我最接近的解决方案-您可以拆分/爆炸MySQL查询中的字段吗? 回答1 我建议的一种选择是使用common_schema,特别是使用get_num_tokens()和split_token()函数,这将有所帮助。 这是您可以适应您的解决方案的简单用法示例: /* CODE FOR DEMONSTRATION PURPOSES */ /* Need to install common_schema -
  • MySQL:将逗号分隔的列表分成多行(MySQL: Split comma separated list into multiple rows)
    问题 我有一个未标准化的表,其中的列包含逗号分隔的列表,该列表是另一个表的外键: +----------+-------------+ +--------------+-------+ | part_id | material | | material_id | name | +----------+-------------+ +--------------+-------+ | 339 | 1.2mm;1.6mm | | 1 | 1.2mm | | 970 | 1.6mm | | 2 | 1.6mm | +----------+-------------+ +--------------+-------+ 我想将此数据读入不提供过程语言的搜索引擎中。 那么,有没有办法要么使此列上的一个连接或这个数据运行查询插入相应的条目到一个新的表? 产生的数据应如下所示: +---------+-------------+ | part_id | material_id | +---------+-------------+ | 339 | 1 | | 339 | 2 | | 970 | 2 | +---------+-------------+ 如果DBMS支持返回表的函数,但MySQL显然不支持,我可以想到一个解决方案。 回答1 在MySQL中,可以通过以下方式实现 SELECT id
  • 我怎么知道什么时候完成SQL全文索引填充?(How can I know when SQL Full Text Index Population is finished?)
    问题 我们正在为针对测试SQL Server数据库运行的ASP.NET应用程序编写单元测试。 也就是说,ClassInitialize方法使用测试数据创建一个新数据库,而ClassCleanup删除该数据库。 我们通过运行代码中的.bat脚本来实现。 给被测类提供一个连接字符串,该字符串连接到单元测试数据库而不是生产数据库。 我们的问题是,数据库包含全文索引,需要使用测试数据完全填充该全文索引,以便我们的测试能够按预期运行。 据我所知,全文索引始终填充在后台。 我希望能够: 使用同步(transact-SQL?)语句创建完全填充的全文本索引,或者找出全文填充的完成时间,是否有回调选项,或者我可以重复问一遍? 我当前的解决方案是在类初始化方法的最后强制延迟-5秒似乎可以工作-因为我在文档中找不到任何内容。 回答1 您可以使用FULLTEXTCATALOGPROPERTY查询状态(请参见此处:http://technet.microsoft.com/zh-cn/library/ms190370.aspx)。 例如: SELECT FULLTEXTCATALOGPROPERTY(cat.name,'ItemCount') AS [ItemCount], FULLTEXTCATALOGPROPERTY(cat.name,'MergeStatus') AS [MergeStatus]
  • Split Single Column into multiple and Load it to a Table or a View
    I'm using SQL Server 2008. I have a source table with a few columns (A, B) containing string data to split into a multiple columns. I do have function that does the split already written. The data from the Source table (the source table format cannot be modified) is used in a View being created. But I need to have my View have already split data for Column A and B from the Source table. So, my view will have extra columns that are not in the Source table. Then the View populated with the Source table is used to Merge with the Other Table. There two questions here: Can I split column A and B
  • Jquery-ui autocomplete dropdown below each word
    I'm using Autocomplete from jquery-ui. In the multiple values, you can get dropdown list for each word after space, but the dropdown appears at the size of the input box. Is it possible to make the dropdown appear below the cursor of each which has a width equivalent to the dropdown words and not the entire length of the input box? EDIT: Example (Google-like search box): When you go to google and enter a long sentence as the sentence goes on, after each word, an autocomplete dropdown appears for each single word below the cursor position. So I require a similar dropdown which can be added on
  • 这才是你需要的最基础的数据库面试题(通俗易懂)
    如果有什么丢失的基础点或者描述的有错误的地方欢迎评论或者私信 这里原谅小编没有写超链接,但是可以打开目录点击同样快速访问 以后CSDN可能也不怎么更新了(个人原因😔),这段时间和蓝桥杯的群里以及CSDN大佬们的日常唠嗑让我获益匪浅,真的就是优秀的人连唠嗑都是在学习 1. 触发器的作用? 触发器是一个特殊的存储过程,当对指定的表进行某种特定操作(如:Insert,Delete或Update)时,触发器产生作用。触发器可以调用存储过程。 触发器的语句 Create Trigger[owner.]触发器名 On [owner.]表名 For {insert,update,delete} As Begin SQL语句(块) End 触发器的限制: 一个表最多只能有三个触发器,insert,update,delete 每个触发器只能用于一个表 不能对视图、临时表创建触发器 Truncate table能删除表,但不能触发触发器 不能将触发器用于系统表 常见的触发器有三种:分别应用于Insert,Update,Delete事件。 2. 什么是存储过程?用什么来调用? 存储过程其实就是一个sql的方法(你就当成Java(或者C#等等)自己写的方法,调用存储过程其实就是调用方法) 如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。 可以用一个“execute 存储过程名 参数
  • SQL Server2012 复习
    企业级的商务网站使用 数据库组成 数据文件 日志文件 系统数据库 master model msdb tempdb 数据类型 CHARACTER(n) 字符/字符串。固定长度 n。 VARCHAR(n) 或CHARACTER VARYING(n) 字符/字符串。可变长度。最大长度 n。 BINARY(n) 二进制串。固定长度 n。 BOOLEAN 存储 TRUE 或 FALSE 值 VARBINARY(n) 或BINARY VARYING(n) 二进制串。可变长度。最大长度 n。 INTEGER§ 整数值(没有小数点)。精度 p。 SMALLINT 整数值(没有小数点)。精度 5。 INTEGER 整数值(没有小数点)。精度 10。 BIGINT 整数值(没有小数点)。精度 19。 DECIMAL(p,s) 精确数值,精度 p,小数点后位数 s。例如:decimal(5,2) 是一个小数点前有 3 位数,小数点后有 2 位数的数字。 NUMERIC(p,s) 精确数值,精度 p,小数点后位数 s。(与 DECIMAL 相同) FLOAT§ 近似数值,尾数精度 p。一个采用以 10 为基数的指数计数法的浮点数。该类型的 size 参数由一个指定最小精度的单一数字组成。 REAL 近似数值,尾数精度 7。 FLOAT 近似数值,尾数精度 16。 DOUBLE PRECISION
  • 从 EntityFramework 调用存储过程时出错(Error calling Stored Procedures from EntityFramework)
    问题 我正在尝试从 EntityFramework 访问存储过程。 我已按照以下步骤操作: 首先,我在 Azure 数据库中创建了存储过程: 然后,我从数据库更新了 .edmx 模型,只选择了我想要的 StoredProcedure。 完成后,在函数导入中,我看到添加了 StoredProcedure,但不在 StoredProcedures 部分。 我该怎么做才能让它出现在这里? 在函数导入部分,所有参数都设置为输入,而“MaxReference”应标记为输出。 我怎样才能改变它? 虽然这两个问题我已经执行了代码: 我得到以下异常: EntityCommandCompilationException An error occurred while preparing command definition. See the inner exception for details. 和内部异常: The function import 'DataModelEntities.AssignMaxSalesRef' cannot be executed because it is not assigned to a storage function. 回答1 您可能需要参考这篇博文:FunctionImport is not maps to a store function Error
  • 防止 GDB 中的 PLT(过程链接表)断点(Prevent PLT (procedure linkage table) breakpoints in GDB)
    问题 在最新版本的 GDB 中,在库函数调用上设置断点会导致多个实际断点: 调用过程链接表 (PLT) 实际的函数调用 这意味着当库函数被调用时,我们每次都会经历两次中断。 在以前的 GDB 版本中,只会创建 #2,因此您只能休息一次。 那么问题来了:能不能在没有对应的PLT断点的情况下创建库函数调用断点呢? 我知道您可以创建一个常规断点,然后显式禁用 PLT 断点,但这真的很乏味。 回答1 我想我找到了解决这个问题的方法。 您可以使用 break *address break 的语法,但不是指定十六进制地址,而是给出函数的名称(计算结果为函数的地址)。 就像是 break *myfunction 这仅在主函数上设置断点,而不是任何 PLT 版本。 回答2 将这些行添加到您的~/.gdbinit文件并调用disaplts以禁用所有@plt断点: define disaplts python import gdb from StringIO import StringIO lines=gdb.execute("info break", True, True) for l in StringIO(lines).readlines(): if "@plt" in l: bp=l.split()[0] gdb.execute("disa {0}".format(bp)) print(
  • 美团数据开发工程师面试准备
    SQL 找出总成绩最高的那个人和所有课程的成绩 select S.ID, S.SNAME, C.ID, C.CNAME, SC.CORE from S,SC,C where S.ID=SC.SID and SC.CID=C.ID limit 10; 找出每门课程都高于80的人 注意: having中的属性必须出现在select中select中的聚合函数不能出现在where中 select S.ID, S.SNAME, min(SC.SCORE) from S,SC where S.ID=SC.SID group by S.ID having min(SC.SCORE)>80; left join 和 inner join的区别 参考链接 on和where的区别 以 LEFT JOIN 为例:在使用 LEFT JOIN 时,ON 和 WHERE 过滤条件的区别如下: ON 条件是在生成临时表时使用的条件,它不管 ON 中的条件是否为真,都会返回左边表中的记录;WHERE 条件是在临时表已经生成后,对临时表进行的过滤条件。因为此时已经没有 LEFT JOIN 的含义(必须返回左侧表的记录)了,所以如果 WHERE 条件不为真的记录就会被过滤掉。 InnoDB和MyISAM的区别 参考链接 MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持等高级处理
  • 将单列拆分为多列并将其加载到表或视图中(Split Single Column into multiple and Load it to a Table or a View)
    问题 我正在使用 SQL Server 2008。我有一个源表,其中包含要拆分为多个列的字符串数据的几列 (A、B)。 我确实有功能可以完成已经编写的拆分。 正在创建的视图中使用源表中的数据(源表格式无法修改)。 但是我需要让我的视图已经从源表中拆分 A 列和 B 列的数据。 因此,我的视图将包含源表中没有的额外列。 然后使用源表填充的视图与其他表合并。 这里有两个问题: 我可以在创建视图时从源表中拆分 A 列和 B 列,但不更改源表吗? 如何在视图“选择”语句中使用我现有的用户定义函数来完成此任务? 想法简而言之: 注释掉部分的示例中也显示了要拆分的字符串。 几乎有 Destination 表、vStandardizedData View、SP,它使用 View 数据合并到 tblStandardizedData 表。 因此,在我的 Source 列中,我需要在加载到 tblStandardizedData 表之前拆分 A 列和 B 列。 我正在处理五个对象: 源文件目的地表 v标准化数据视图 tblStandardizedData 表合并(更新和插入)形成 vStandardizedData 视图的存储过程。 注意:所有 5 个对象都按照它们应该被创建和加载的顺序列出。 除此之外,还有一个现有的 UDFunction 可以拆分我被告知要使用的字符串 A列(B列具有相同格式数据
  • 基于Windchill的CAPA工具在制造业中的实际应用
    背景CAPA适用于GMP运行过程产生的各类(潜在)不符合CAPA制定、实施及闭环确认环节。CAPA工具不仅适用于制药企业,对传统的制造业也同样适用。纠正和预防措施是指对存在的或潜在的不合格原因进行调查分析,采取措施以防止问题再发生或避免发生的全部活动。纠正和预防不仅是就事论事的对不合格的处理,而要从根本上消除产生不合格的原因,因此纠正和预防措施可能涉及影响产品质量和质量体系的各方面活动。没有纠正预防措施,质量体系就不可能正常运行和体现出有效性。为消除实际或潜在的不合格原因而采取的纠正和预防措施,要有一定的人力和物力的投入,投入多少应与问题大小,风险程度高低相适应,即用最佳成本获得规定产品特性要求和质量体系要求的有效性。并不是对每次发生的不合格立即采取纠正措施,应考虑定期分析不合格的类型,发现过程改进的重点和采取必要的纠正措施。2制造业CAPA整体概览在移动发电机组行业中,一般都是订单式的销售。发电机组通常都送往条件较为恶劣的地区,例如停水停电等灾区或者发展较为落后,电力缺乏的地区。然而这些地区情况各有不同,且现阶段国内发电机组行业出口趋势明显,这就直接导致客户下订单的需求各不相同,且一次下单采购的发电机组数量并不多。在此情况下,产品经常出现各种质量问题。●超差超差指的是产品设计完成后,企业向供应商采购部件,供应商完成部件制造后运送至企业。企业质量部根据设计图纸及《质量检验作业指导¹
  • 我是否正确规范了这些数据(Am I Properly Normalizing this Data)
    问题 我正在通过网络完成规范化练习,以测试我规范化数据的能力。 此特定问题位于:https://cs.senecac.on.ca/~dbs201/pages/Normalization_Practice.htm(练习 1) 此问题所依据的表格如下: 可以从此表创建的非规范化表是: 为了符合第一范式,我必须通过将visitdate、procedure_no和procedure_name移动到它们各自的表中来摆脱表中的重复字段: 这也符合 2NF 和 3NF,这让我怀疑我是否正确执行了规范化过程。 如果我没有正确地从 UNF 转移到 1NF,请提供反馈。 回答1 在第一步中,您可以创建以下表(假设pet_id在表中是唯一的): Pets: pet_id, pet_name, pet_type, pet_age, owner Visits: pet_id, visit_date, procedure 更进一步,您可以拆分procedure因为描述是重复的: Pets: pet_id, pet_name, pet_type, pet_age, owner Visits: pet_id, visit_date, procedure_id Procedures: procedure_id, description 尽管对于同一个visit_date在同一个pet
  • 从 Rails 4 应用程序调用大量 SQL(Invoking a large set of SQL from a Rails 4 application)
    问题 我有一个 Rails 4 应用程序,我将它与sidekiq结合使用来运行异步作业。 我通常在 Rails 应用程序之外运行的工作之一是大量复杂的 SQL 查询,它们无法真正由 ActiveRecord 建模。 这组 SQL 查询与我的 Rails 应用程序之间的联系是它应该在调用我的控制器操作之一时执行。 理想情况下,我会在控制器中将 Rails 应用程序中的作业排队,以便 Sidekiq 继续运行查询。 现在它们存储在一个外部文件中,我不完全确定让 Rails 运行上述 SQL 的最佳方法是什么。 任何解决方案表示赞赏。 回答1 我同意 Sharagoz,如果您只需要运行特定查询,最好的方法是将查询字符串直接发送到连接中,例如: ActiveRecord::Base.connection.execute(File.read("myquery.sql")) 如果查询不是静态的并且您必须编写它,我会使用 Arel,它已经存在于 Rails 4.x 中: https://github.com/rails/arel 回答2 你没有说你使用的是什么数据库,所以我将假设 MySQL。 您可以使用mysql二进制文件来完成这项工作: result = `mysql -u #{user} --password #{password} #{database} < #{huge_sql
  • 使用一个接受可变数量参数的存储过程是一种好习惯吗?(Is it good practice to use one single stored procedure that accepts a variable number of parameters)
    问题 我正在从事一个网络项目,我必须在其中检索(假设)员工记录。 在某些情况下,我必须通过提供 EmployeeID 来检索单个记录。 在其他情况下,我必须通过提供 SectorID 来检索多个员工记录。 可以扩展此逻辑以涵盖其他场景:获取所有员工记录、按资格获取员工记录等。 使用一个接受可变数量参数的单个存储过程来处理不同的场景(在未提供参数时使用默认值)是否是一种好习惯。 前任: CREATE PROCEDURE [dbo].[GetEmployeeRecords] ( @employeeID int = -1, @sectorID int = -1 ) AS BEGIN SELECT EmployeeID, EmployeeFirstName, EmployeeLastName, s.SectorName FROM dbo.Employees e INNER JOIN Sectors s ON e.SectorID = s.SectorID WHERE (e.EmployeeID = @EmployeeID OR @EmployeeID = -1) AND (e.SectorID = @SectorID OR @SectorID = -1) 回答1 这是一篇关于这个主题的非常全面的文章: Erland Sommarskog 在 T-SQL 中的动态搜索条件