我正在查询一个包含多个字母数字键列的表...
KEY1 KEY2 KEY3 ... SOMEDATA SOMEOTHERDATA...
s001
s002
s003 s004 s005
s006
键是我们需要加入的另一个表的 PK,这很烦人但并不困难。但后来他们决定这样做......
s010-s105
这意味着 s010、s011...s015。有什么方法可以进行查询来打破这一点,以便我可以在这些列中找到给定的键,比如 s013?
我正在查询一个包含多个字母数字键列的表...
KEY1 KEY2 KEY3 ... SOMEDATA SOMEOTHERDATA...
s001
s002
s003 s004 s005
s006
键是我们需要加入的另一个表的 PK,这很烦人但并不困难。但后来他们决定这样做......
s010-s105
这意味着 s010、s011...s015。有什么方法可以进行查询来打破这一点,以便我可以在这些列中找到给定的键,比如 s013?
好吧,请不要因为这个查询而恨我,因为我确信有更好的方法来做到这一点(从修复这个设计开始)。使用您发布的示例数据,此查询应将原始表中的每个键作为单个列 (
KEY_Unified
) 提供给您:不过有几个假设。
s001-s100
,您不能拥有s001-s100,s005-s006
s001
till开始s999
如果你有一个数字表,你可以解析出范围的两个部分并加入你的数字表。然后你只需要将它格式化回你的连接键的格式。
rextester演示:http ://rextester.com/KAJ77714
回报:
号码表参考:
T-SQL - 246 字节
又快又脏:
需要注意的是 parsename 不会挖掘超过 4 个级别
而且我还要加一个...
结合上面的一些代码和一些基本的字符串操作,我所做的是进行一个内部查询,返回两个字段中减号的任一侧......
这会返回类似...
接下来,我将其包装在另一个使用 PATINDEX 将数字与数字分开的查询中......
结果是这样的......
如果有人有好的方法将前面的两个查询合并为一个,我将不胜感激。
此示例的一大优点是密钥的文本部分可以是任何内容,因此此方法适用于“ABC100”和“S10”。最后的技巧是将该查询包装在另一个具有您的 WHERE ...
第一部分提取您要查找的密钥的数字部分和 BETWEENs,但这当然意味着“A100”和“B100”都匹配。所以第二部分提取非数字部分并将其与范围内键的非数字部分进行比较。
这假设范围将始终类似于“A100-A999”,而不是“A100-B100”
我怀疑有一些方法可以将其显着简化为一个或两个步骤的查询,但目前它正在运行!