TSQL:substring包含0-9之间的所有数字,除了5

时间:2013-01-31 14:19:49

标签: sql sql-server tsql

我在案例陈述中使用子字符串函数返回'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 个答案:

答案 0 :(得分:7)

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

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

要将数字传输到数十位或更多位置,您可能需要考虑将这些值放入可用于joinexistsin的表格中

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