SQL子字符串还是从右边选择?

时间:2017-08-10 19:04:24

标签: sql sql-server

我想知道是否有人可以向我解释这一点。

Where substring(t1.MemoTypeCode,1,1) = N'_'  

这将采用MemoTypecode,其中第一个字符为_

现在我正在尝试做类似的事情,但检查最后一个字符是否为_

我在这里看到类似的东西:T-SQL Substring - Last 3 Characters但不幸的是,没有运气。

Where RIGHT(t1.MemoTypeCode, 1) = N'_'  

这应该采用MemoTypeCode,其中最后一个字符为_但不起作用

整个代码:

Select t1.MemoTypeCode, t1.Description
  From T_MemoType t1
  --Where substring(t1.MemoTypeCode,1,1) = N'_'  This will take MemoTypecode where first character is _

  --Where RIGHT(t1.MemoTypeCode, 1) = N'_'  this is supposed to take MemoTypeCode where last character is _ but is not working
  Order by t1.MemoTypeCode

任何想法为什么子字符串工作正常而Where Right不起作用?

3 个答案:

答案 0 :(得分:2)

也许你的场上有一些尾随的空白区域(用眼睛很难发现)。这可能是由于数据负载不好,或者可能使用CHAR / NCHAR,其中分配的内存块填充空间以填充空间(尽管我认为RIGHT()足够智能来修剪CHAR)。

在抓取它的子串之前尝试修剪该字段:

WHERE RIGHT(RTRIM(t1.MemoTypeCode), 1) = N'_'

答案 1 :(得分:-1)

我不明白这个问题......

with cte (val) as (Select N'_test' union all
                   select N'test_')

Select val
     , case when left(val,1) = N'_' then 1 else 0 end as startsWithUnderscore
     , case when right(val,1) = N'_' then 1 else 0 end as EndsWithUnderscore
from cte;

+----+-------+----------------------+--------------------+
|    |  val  | startsWithUnderscore | EndsWithUnderscore |
+----+-------+----------------------+--------------------+
|  1 | _test |                    1 |                  0 |
|  2 | test_ |                    0 |                  1 |
+----+-------+----------------------+--------------------+

RexTester:http://rextester.com/NDCKJ46846

答案 2 :(得分:-2)

_是一个非常特别的。它代表任何一个。请改用[]。喜欢: 其中substring(t1.MemoTypeCode,1,1)= N' []' 尝试