最近在做门户网站的调查问卷功能,发现答案和问题根本不是一一对应的,经过一番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中字段前面不能有空格,如果有空格也不会正常排序。