sql 语句 两个字段的模糊查询

qq_35054088 2017-10-16 11:11:12
核心问题:比如某个字段的一条信息 SR801P5000 想找到 用一张表中的 SR801C5000,就只有 P和C不同

这个该怎么办?

全部提问题:一个表中 datetime 和 code 唯一确定一条信息,现在根据条件筛选出来了 code和 datetime ,想进而模糊匹配查询对应datetime下的另一个code的所有信息
...全文
1367 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
日月路明 2017-10-18
  • 打赏
  • 举报
回复
另外还有比较简单的写法 select * from #t where (b like 'SR802_6000') and b<>'SR802C6000'
日月路明 2017-10-18
  • 打赏
  • 举报
回复
一般的讲,如果在实现某项业务的时候特别困难,可能是设计问题,最好变更一下设计思路
日月路明 2017-10-18
  • 打赏
  • 举报
回复
如果这种查询是一个刚需,我可能会把 SR801P6000用三个字段实现,这样查询就会得到极大简化
qq_35054088 2017-10-17
  • 打赏
  • 举报
回复
引用 20 楼 sinat_28984567 的回复:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([a] Date,[b] nvarchar(30))
Insert #T
select '20170922',N'SR801P6000' union all
select '20170922',N'SR801P6500' union all
select '20170922',N'SR801C6000' union all
select '20170923',N'SR802P6000' union all
select '20170923',N'SR803P6500' union all
select '20170923',N'SR802C6000'
Go
--测试数据结束
SELECT  *
FROM    #T
WHERE   b IN ( SELECT   CASE WHEN b LIKE '%C%' THEN REPLACE(b, 'C', 'P')
                             ELSE REPLACE(b, 'P', 'C')
                        END
               FROM     #T
               WHERE    b IN ( 'SR801P6000', 'SR802C6000' ) )  --这两个是已经的红色的那个
非常谢谢!!!! 感谢
qq_35054088 2017-10-17
  • 打赏
  • 举报
回复
引用 19 楼 yenange 的回复:
[quote=引用 15 楼 qq_35054088 的回复:] [quote=引用 14 楼 yenange 的回复:]
-- 一次找两个相关的记录
SELECT * FROM t AS a WHERE a.dt=@dt AND (a.code=@code OR a.code = STUFF(@code,6,1,'C'))
/*
dt                      code
----------------------- --------------------
2017-09-22 00:00:00.000 SR801C6000
2017-09-22 00:00:00.000 SR801P6000

(2 行受影响)
*/
非常谢谢! 我去试试! 虽然有部分不太懂,您之前哪些不太像sql的语言是php吗?还是? sql 原生语言? 抱歉啊!小白痴不太懂呢[/quote] 这就是原生的SQL. 明不明白什么叫参数化? 你把 @dt 换成实际日期, @code 换成 ’xxx‘ 就可以了。 因为 #13 中写了这些, #14 不想再啰嗦了。 参数化是可以起优化作用的,而且更安全。 [/quote] 好的谢谢您! 参数还是懂的!
  • 打赏
  • 举报
回复
引用 6 楼 qq_35054088 的回复:
但是 前后多少位,应该截取多长应该是相同的
qq_35054088 2017-10-16
  • 打赏
  • 举报
回复
引用 7 楼 baidu_36457652 的回复:
[quote=引用 6 楼 qq_35054088 的回复:]
但是 前后多少位,应该截取多长应该是相同的[/quote] 您好!我就简单看了下 substr 函数 感觉只是截取?没有太懂之前那位老兄说的意思
qq_35054088 2017-10-16
  • 打赏
  • 举报
回复
引用 9 楼 yenange 的回复:
不太明白你意思, 是不是这样:
DECLARE @code1 VARCHAR(20),@code2 VARCHAR(20),@d DATETIME
SET @d = '2017-10-16'
SET @code1='SR801P5000'
SET @code2=STUFF(@code1,6,1,'C')
/*
PRINT @code2
--SR801C5000
*/

SELECT * FROM t WHERE d=@d AND code1=@code1

SELECT * FROM t WHERE d=@d AND code2=@code2


引用 9 楼 yenange 的回复:
不太明白你意思, 是不是这样:
DECLARE @code1 VARCHAR(20),@code2 VARCHAR(20),@d DATETIME
SET @d = '2017-10-16'
SET @code1='SR801P5000'
SET @code2=STUFF(@code1,6,1,'C')
/*
PRINT @code2
--SR801C5000
*/

SELECT * FROM t WHERE d=@d AND code1=@code1

SELECT * FROM t WHERE d=@d AND code2=@code2



您好!是这样哦
我的表格部分
datetime code
20170922 SR801P6000
20170922 SR801P6500
20170922 SR801C6000
但是想根据第一行找出第三行来
吉普赛的歌 2017-10-16
  • 打赏
  • 举报
回复
不太明白你意思, 是不是这样:
DECLARE @code1 VARCHAR(20),@code2 VARCHAR(20),@d DATETIME
SET @d = '2017-10-16'
SET @code1='SR801P5000'
SET @code2=STUFF(@code1,6,1,'C')
/*
PRINT @code2
--SR801C5000
*/

SELECT * FROM t WHERE d=@d AND code1=@code1

SELECT * FROM t WHERE d=@d AND code2=@code2
qq_35054088 2017-10-16
  • 打赏
  • 举报
回复
引用 4楼acen_chen 的回复:
自己用substr拼sql啊。。。
您能具体举个例子吗?
qq_35054088 2017-10-16
  • 打赏
  • 举报
回复
引用 5楼530303869 的回复:
可以换个思路,比如截取几个值,然后再对应匹配看看
主要是每天个条件查出来datetime对应下的code不同
  • 打赏
  • 举报
回复
可以换个思路,比如截取几个值,然后再对应匹配看看
acen_chen 2017-10-16
  • 打赏
  • 举报
回复
自己用substr拼sql啊。。。
二月十六 2017-10-16
  • 打赏
  • 举报
回复
只差一个字符的搜索出来,差两个的呢?
qq_35054088 2017-10-16
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
只差一个字符的搜索出来,差两个的呢?
都是只差一个的哦!求问大佬知道怎么办?吗
qq_35054088 2017-10-16
  • 打赏
  • 举报
回复
都是只差一个的哦!求问大佬知道怎么办?吗
吉普赛的歌 2017-10-16
  • 打赏
  • 举报
回复
引用 15 楼 qq_35054088 的回复:
[quote=引用 14 楼 yenange 的回复:]
-- 一次找两个相关的记录
SELECT * FROM t AS a WHERE a.dt=@dt AND (a.code=@code OR a.code = STUFF(@code,6,1,'C'))
/*
dt                      code
----------------------- --------------------
2017-09-22 00:00:00.000 SR801C6000
2017-09-22 00:00:00.000 SR801P6000

(2 行受影响)
*/
非常谢谢! 我去试试! 虽然有部分不太懂,您之前哪些不太像sql的语言是php吗?还是? sql 原生语言? 抱歉啊!小白痴不太懂呢[/quote] 这就是原生的SQL. 明不明白什么叫参数化? 你把 @dt 换成实际日期, @code 换成 ’xxx‘ 就可以了。 因为 #13 中写了这些, #14 不想再啰嗦了。 参数化是可以起优化作用的,而且更安全。
qq_35054088 2017-10-16
  • 打赏
  • 举报
回复
引用 17楼二月十六 的回复:
是固定的C和P之间互换吗?
是的!已知都是SR***P****或者中间换成C。对应的去查SR***C****或中间换成P
qq_35054088 2017-10-16
  • 打赏
  • 举报
回复
引用 13 楼 yenange 的回复:
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(dt DATETIME,code VARCHAR(20))
GO
INSERT INTO t
SELECT '20170922','SR801P6000' 
 UNION SELECT '20170922','SR801P6500' 
 UNION SELECT '20170922','SR801C6000' 

DECLARE @code VARCHAR(20),@dt DATETIME
SET @code='SR801P6000'
SET @dt='20170922'

SELECT * FROM t AS a WHERE a.dt=@dt AND a.code = STUFF(@code,6,1,'C') AND EXISTS(
	SELECT 1 FROM t AS b WHERE a.dt=b.dt AND b.code=@code	
)
/*
dt                      code
----------------------- --------------------
2017-09-22 00:00:00.000 SR801C6000

(1 行受影响)
*/
您好! 20170922 SR801P6000 20170922 SR801P6500 20170922 SR801C6000 20170923 SR802P6000 20170923 SR803P6500 20170923 SR802C6000 如果现在已知第一个和第二个 怎么找出蓝色的呢?
二月十六 2017-10-16
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([a] Date,[b] nvarchar(30))
Insert #T
select '20170922',N'SR801P6000' union all
select '20170922',N'SR801P6500' union all
select '20170922',N'SR801C6000' union all
select '20170923',N'SR802P6000' union all
select '20170923',N'SR803P6500' union all
select '20170923',N'SR802C6000'
Go
--测试数据结束
SELECT *
FROM #T
WHERE b IN ( SELECT CASE WHEN b LIKE '%C%' THEN REPLACE(b, 'C', 'P')
ELSE REPLACE(b, 'P', 'C')
END
FROM #T
WHERE b IN ( 'SR801P6000', 'SR802C6000' ) ) --这两个是已经的红色的那个


加载更多回复(5)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧