Mat*_*att 3 sql sql-server-2008
我有一个WHERE逻辑上的条款,我想让它在短名称的第一个数字不匹配的情况下返回结果.
简称可以是:
1.1
1.2
2.1
2.2
Run Code Online (Sandbox Code Playgroud)
示例数据WITHOUT where子句:
+-----------+--------+------+
| Shortname | number | ID |
+-----------+--------+------+
| 2.1 | 1 | 3333 |
| 1.1 | 60 | 3333 |
| 1.2 | 90 | 3333 |
| 2.1 | 50 | 4444 |
| 2.2 | 30 | 4444 |
| 1.1 | 80 | 5555 |
| 1.2 | 10 | 5555 |
+-----------+--------+------+
Run Code Online (Sandbox Code Playgroud)
预期数据WITH where子句:
+-----------+--------+------+
| Shortname | number | ID |
+-----------+--------+------+
| 2.1 | 1 | 3333 |
| 1.1 | 60 | 3333 |
| 1.2 | 90 | 3333 |
+-----------+--------+------+
Run Code Online (Sandbox Code Playgroud)
我试过这段代码:
SELECT shortname, number, id
FROM table
WHERE ((left(shortname,1) like '%1%') != ((left(shortname,1) like '%2%')
Run Code Online (Sandbox Code Playgroud)
但它会产生错误:
消息102,级别15,状态1,行21
'''附近的语法不正确.
澄清更新
我需要每个ID的结果,所以在上面的示例中有ID 3333,4444和5555.我想只返回ID,3333因为它不是每个都只有一个第一个字符值shortname.它包含值1和2.
因为我不希望看到其他ID,因为短名称匹配在第一个数字1 = 1和2 = 2等.
Tar*_*ryn 10
如果要在其中返回ID多个第一个字符shortname,则首先查看获取行的不同计数:
select id
from yourtable
group by id
having count(distinct left(shortname, 1)) > 1;
Run Code Online (Sandbox Code Playgroud)
当与ID关联时,这应该返回具有2和1作为第一个字符的行.然后你可以用它来返回其余的数据:
;with cte as
(
select id
from yourtable
group by id
having count(distinct left(shortname, 1)) > 1
)
select
t.shortname,
t.number,
t.id
from yourtable t
inner join cte c
on t.id = c.id;
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle with Demo.返回:
| SHORTNAME | NUMBER | ID |
|-----------|--------|------|
| 2.1 | 1 | 3333 |
| 1.1 | 60 | 3333 |
| 1.2 | 90 | 3333 |
Run Code Online (Sandbox Code Playgroud)
更灵活的选项是获取小数点前的字符,并验证您是否具有所有数字的明确计数.要做到这一点,你会使用这样的函数CHARINDEX与一起LEFT.
;with cte as
(
select id
from yourtable
group by id
having count(distinct left(shortname, charindex('.', shortname)-1)) > 1
)
select
t.shortname,
t.number,
t.id
from yourtable t
inner join cte c
on t.id = c.id;
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle with Demo.这将返回:
| SHORTNAME | NUMBER | ID |
|-----------|--------|------|
| 2.1 | 1 | 3333 |
| 1.1 | 60 | 3333 |
| 1.2 | 90 | 3333 |
| 14.1 | 5 | 6666 |
| 14.2 | 78 | 6666 |
| 24.1 | 89 | 6666 |
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
210 次 |
| 最近记录: |