SQL使用in查询按条件顺序返回

最近在做门户网站的调查问卷功能,发现答案和问题根本不是一一对应的,经过一番Debug后发现是SQL中的in查询输出时不是按条件的顺序返回的,而是无序的。后经过一番研究,在网上参考了一些资料后,总结如下,希望可以帮到大家。

一、IN条件返回无序结果

SELECT
	AnswerTitle
FROM
	QuestionnaireAnswer
WHERE
	ID IN (
		'214235f4-9b6f-4259-a58a-903b185ba0a6',
		'dd6f0b82-6c29-49c4-83b3-8bdb62347b60',
		'8d064ad3-22e2-4368-a68a-3107e087a44d',
		'd634e2eb-ad34-46ab-bc55-7f6326297c1e',
		'43de0e95-edb0-499e-98ab-77071a04d3be',
		'5ec3d7de-0ed6-42e8-889f-b5a1005e2e20',
		'0a70e91c-3067-48c1-b21b-ac1b6cf450d3',
		'91640ae6-f3d3-4835-b3e2-4950e8f77c74',
		'fb9e3009-5bc9-424e-ac2a-6d686af67097',
		'63887d16-e351-4c5a-9ae3-894bb1301823',
		'3680fef4-f0dd-4d08-8006-c188915b3531'
	)

无序结果:(问卷题目与答案不一致)

AnswerTitle
您的性别:好
您的年龄段:女
您之前听说过xxxx吗:不是
对于xxxx的门票价格:陪伴朋友、家人
您为什么来xxxx:觉得一般
您对xxxx的主题活动的态度:服务不到位
员工的服务态度:没听说过
您是否会期待下一次的游玩:一般
您对xxxx哪方面比较满意:略贵
您觉得xxxx还有那些需要改善:36岁~45岁 
您是否在xxxx度过了难忘的一天:游乐设施

后台通过研究发现使用charindex函数可以返回在被找的字符串中的位置,再则配合order by进行排序,从而输出in指定条件顺序。。

二、SQL Server使用charindex函数返回有序结果

SELECT
	a.*
FROM
	QuestionnaireCount a
WHERE
	ID = 'd4da5f25-3b38-411d-9219-29a340857d45';

SELECT
		*
	FROM
		QuestionnaireAnswer
	WHERE
		ID IN (
			'214235f4-9b6f-4259-a58a-903b185ba0a6',
			'6097cb83-6dd7-4cf1-a515-22978d5c4a12',
			'8d064ad3-22e2-4368-a68a-3107e087a44d',
			'd634e2eb-ad34-46ab-bc55-7f6326297c1e',
			'43de0e95-edb0-499e-98ab-77071a04d3be',
			'5ec3d7de-0ed6-42e8-889f-b5a1005e2e20',
			'0a70e91c-3067-48c1-b21b-ac1b6cf450d3',
			'91640ae6-f3d3-4835-b3e2-4950e8f77c74',
			'fb9e3009-5bc9-424e-ac2a-6d686af67097',
			'63887d16-e351-4c5a-9ae3-894bb1301823',
			'3680fef4-f0dd-4d08-8006-c188915b3531'
		)
ORDER BY
	charindex(
		 ID ,'	214235f4-9b6f-4259-a58a-903b185ba0a6,
		        6097cb83-6dd7-4cf1-a515-22978d5c4a12,
			8d064ad3-22e2-4368-a68a-3107e087a44d,
			d634e2eb-ad34-46ab-bc55-7f6326297c1e,
			43de0e95-edb0-499e-98ab-77071a04d3be,
			5ec3d7de-0ed6-42e8-889f-b5a1005e2e20,
			0a70e91c-3067-48c1-b21b-ac1b6cf450d3,
			91640ae6-f3d3-4835-b3e2-4950e8f77c74,
			fb9e3009-5bc9-424e-ac2a-6d686af67097,
			63887d16-e351-4c5a-9ae3-894bb1301823,
			3680fef4-f0dd-4d08-8006-c188915b3531'
	)






有序结果(问卷题目与答案一致)

AnswerTitle
您的性别:女
您的年龄段:5岁~25岁
您之前听说过xxxx吗?没听说过
对于xxxx的门票价格:略贵
您为什么来xxxx:陪伴朋友、家人
您对xxxx的主题活动的态度:觉得一般
员工的服务态度:好
您是否会期待下一次的游玩:一般
您对xxxx哪方面比较满意:游乐设施
您觉得xxxx还有那些需要改善:服务不到位
您是否在xxxx度过了难忘的一天:不是

另外,以上charindex函数只能适应MSSQL数据库写法,Oracle和Mysql使用in查询按条件顺序输出写法如下:

三、Oracle使用decode返回有序结果

SELECT
	a.*
FROM
	QuestionnaireCount a
WHERE
	ID = 'd4da5f25-3b38-411d-9219-29a340857d45';

SELECT
		*
	FROM
		QuestionnaireAnswer
	WHERE
		ID IN (
			'214235f4-9b6f-4259-a58a-903b185ba0a6',
			'6097cb83-6dd7-4cf1-a515-22978d5c4a12',
			'8d064ad3-22e2-4368-a68a-3107e087a44d',
			'd634e2eb-ad34-46ab-bc55-7f6326297c1e',
			'43de0e95-edb0-499e-98ab-77071a04d3be',
			'5ec3d7de-0ed6-42e8-889f-b5a1005e2e20',
			'0a70e91c-3067-48c1-b21b-ac1b6cf450d3',
			'91640ae6-f3d3-4835-b3e2-4950e8f77c74',
			'fb9e3009-5bc9-424e-ac2a-6d686af67097',
			'63887d16-e351-4c5a-9ae3-894bb1301823',
			'3680fef4-f0dd-4d08-8006-c188915b3531'
		)
ORDER BY
	"decode"(
		 ID ,'	214235f4-9b6f-4259-a58a-903b185ba0a6,
			6097cb83-6dd7-4cf1-a515-22978d5c4a12,
			8d064ad3-22e2-4368-a68a-3107e087a44d,
			d634e2eb-ad34-46ab-bc55-7f6326297c1e,
			43de0e95-edb0-499e-98ab-77071a04d3be,
			5ec3d7de-0ed6-42e8-889f-b5a1005e2e20,
			0a70e91c-3067-48c1-b21b-ac1b6cf450d3,
			91640ae6-f3d3-4835-b3e2-4950e8f77c74,
			fb9e3009-5bc9-424e-ac2a-6d686af67097,
			63887d16-e351-4c5a-9ae3-894bb1301823,
			3680fef4-f0dd-4d08-8006-c188915b3531'
	)

四、Mysql使用FIND_IN_SET返回有序结果

SELECT
	a.*
FROM
	QuestionnaireCount a
WHERE
	ID = 'd4da5f25-3b38-411d-9219-29a340857d45';

SELECT
		*
	FROM
		QuestionnaireAnswer
	WHERE
		ID IN (
			'214235f4-9b6f-4259-a58a-903b185ba0a6',
			'6097cb83-6dd7-4cf1-a515-22978d5c4a12',
			'8d064ad3-22e2-4368-a68a-3107e087a44d',
			'd634e2eb-ad34-46ab-bc55-7f6326297c1e',
			'43de0e95-edb0-499e-98ab-77071a04d3be',
			'5ec3d7de-0ed6-42e8-889f-b5a1005e2e20',
			'0a70e91c-3067-48c1-b21b-ac1b6cf450d3',
			'91640ae6-f3d3-4835-b3e2-4950e8f77c74',
			'fb9e3009-5bc9-424e-ac2a-6d686af67097',
			'63887d16-e351-4c5a-9ae3-894bb1301823',
			'3680fef4-f0dd-4d08-8006-c188915b3531'
		)
ORDER BY
	FIND_IN_SET( ID,'214235f4-9b6f-4259-a58a-903b185ba0a6,
			6097cb83-6dd7-4cf1-a515-22978d5c4a12,
			8d064ad3-22e2-4368-a68a-3107e087a44d,
			d634e2eb-ad34-46ab-bc55-7f6326297c1e,
			43de0e95-edb0-499e-98ab-77071a04d3be,
			5ec3d7de-0ed6-42e8-889f-b5a1005e2e20,
			0a70e91c-3067-48c1-b21b-ac1b6cf450d3,
			91640ae6-f3d3-4835-b3e2-4950e8f77c74,
			fb9e3009-5bc9-424e-ac2a-6d686af67097,
			63887d16-e351-4c5a-9ae3-894bb1301823,
			3680fef4-f0dd-4d08-8006-c188915b3531'
	)


PS:Mysql写法用FIND_IN_SET中字段前面不能有空格,如果有空格也不会正常排序。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GentleDevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值