我在案例陈述中使用子字符串函数返回'B0' - 'B9'之间的所有数字
WHEN SUBSTRING (postcode, 1, 2) like 'B[0-9]'
但我不想在此列表中返回数字'B5'。我可以让它像这样工作
WHEN SUBSTRING (postcode, 1, 2) like 'B[0-4]'
WHEN SUBSTRING (postcode, 1, 2) like 'B[6-9]'
但有没有办法将其添加到一行,如下所示?
WHEN SUBSTRING (postcode, 1, 2) like 'B[0-9]' and not like 'B5'
修改
如果你处理0-100之间的数字,你会怎么做,所以sql就像
WHEN SUBSTRING (postcode, 1, 3) like 'B[0-9][0-9]'
但你不想包括16和17?
答案 0 :(得分:7)
WHEN SUBSTRING (postcode, 1, 2) like 'B[012346789]' -- No "5"
LIKE模式非常棒。迷你正则表达式,如果你愿意的话。
要将数字传输到数十位或更多位置,您可能需要考虑将这些值放入可用于join
,exists
或in
的表格中
或者,因为我们将此列的数字部分视为数字而不是字符串,这表明它们可能更好地存储为两列:一列用于alpha,一列用于数字
除非对架构进行任何更改,否则您可能会删除特殊字母字符,以便将它们与一系列数字进行比较,例如:
where cast(replace(postcode, 'B', '') as int) between 0 and 15
or cast(replace(postcode, 'B', '') as int) between 18 and 100
where cast(right(postcode, len(postcode) - 1) as int) between 0 and 15
or cast(right(postcode, len(postcode) - 1) as int) between 18 and 100
这些只是几种可能性。您最了解如何按摩数据。
答案 1 :(得分:3)
您可以尝试使用两个范围,从中删除5:
WHEN SUBSTRING (postcode, 1, 2) like 'B[0-46-9]'
答案 2 :(得分:1)
使用^
代表Not ..请参阅Like ...
但为什么不试试
`WHEN SUBSTRING (postcode, 1, 2) like 'B[0-4]' Or
SUBSTRING (postcode, 1, 2) like 'B[6-9]'`
或者您可以将范围放在相同的括号中
`WHEN SUBSTRING (postcode, 1, 2) like 'B[0-46-9]'
答案 3 :(得分:0)
对于单个数字的情况(您的原始问题),您已经获得了许多很棒的答案。但是如果没有真正的正则表达式,则无法解决多位数问题。
它会断言您有要排除的值列表。在那种情况下你可以使用它:
WHEN SUBSTRING (postcode, 1, 3) like 'B[0-9][0-9]'
AND SUBSTRING (postcode, 1, 3) NOT IN ('B16', 'B17')
如果表格中的“排他性”列表使用NOT EXISTS
代替:
WHEN SUBSTRING (postcode, 1, 3) like 'B[0-9][0-9]'
AND NOT EXISTS(SELECT 1 FROM dbo.excludables AS ex WHERE ex.val = SUBSTRING (postcode, 1, 3))