我有一个WHERE
从逻辑上讲我希望它带回短名称的第一位不匹配的结果的子句。
简称可以是:
1.1
1.2
2.1
2.2
样本数据WITHOUTwhere
子句:
+-----------+--------+------+
| 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 |
+-----------+--------+------+
预期的数据WITHwhere
子句:
+-----------+--------+------+
| Shortname | number | ID |
+-----------+--------+------+
| 2.1 | 1 | 3333 |
| 1.1 | 60 | 3333 |
| 1.2 | 90 | 3333 |
+-----------+--------+------+
我尝试了代码:
SELECT shortname, number, id
FROM table
WHERE ((left(shortname,1) like '%1%') != ((left(shortname,1) like '%2%')
但这会产生错误:
消息102,级别15,状态1,第21
行在“!”附近的语法不正确。
澄清更新
我需要每个ID的结果,因此在上面的示例中有ID的3333、4444和5555。我只想带回ID,3333
因为每个ID中都没有单个的第一个字符值shortname
。它同时包含值1
和2
。
在我不想看到其他ID的地方,因为短名称在第一位数字1 = 1和2 = 2等上匹配。
如果要在中返回ID
多个第一个字符shortname
,请首先查看获取不同的行数:
select id
from yourtable
group by id
having count(distinct left(shortname, 1)) > 1;
当与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;
请参见带有演示的SQL Fiddle。返回:
| SHORTNAME | NUMBER | ID |
|-----------|--------|------|
| 2.1 | 1 | 3333 |
| 1.1 | 60 | 3333 |
| 1.2 | 90 | 3333 |
一个更灵活的选择是获取小数点前的字符,并验证您对所有数字都有不同的计数。要做到这一点,你会使用这样的函数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;
请参见带有演示的SQL Fiddle。这将返回:
| 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 |
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句