我想知道是否有人可以向我解释这一点。
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不起作用?
答案 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' []' 尝试