2

我在 case 语句中使用 substring 函数返回 '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?

4

4 回答 4

7
WHEN SUBSTRING (postcode, 1, 2) like 'B[012346789]' -- No "5"

LIKE模式很棒。迷你正则表达式,如果你愿意的话。

要将数字执行到十位或更多位,您可能需要考虑将这些值放入可用于 a或的表join中。existsin

或者,由于我们将此列的数字部分视为数字而不是字符串,这表明它们可能更好地存储为两列:一列用于 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

这些只是几种可能性。您将最了解如何处理您的数据。

于 2013-01-31T14:21:23.033 回答
3

您可以尝试有两个范围,从中删除 5:

WHEN SUBSTRING (postcode, 1, 2) like 'B[0-46-9]'
于 2013-01-31T14:21:52.930 回答
1

用来^表示不.. 见喜欢...

但为什么不试试

`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]'
于 2013-01-31T14:25:13.033 回答
0

对于个位数的情况(您的原始问题),您已经得到了很多很好的答案。但是,如果没有真正的正则表达式,您将无法解决多位数问题。

它接缝你有一个要排除的值列表。我这种情况下你可以使用这个:

WHEN SUBSTRING (postcode, 1, 3) like 'B[0-9][0-9]'
 AND SUBSTRING (postcode, 1, 3) NOT IN ('B16', 'B17')

如果“excludables”列表在表中,请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))
于 2013-01-31T14:39:04.780 回答