根据标准匹配的不同ORDER BY?

时间:2013-09-26 22:28:48

标签: sql criteria sql-order-by

SQL是否可以根据匹配的条件对返回的行进行不同的排序?

例如,我的网页允许输入姓名或邮政编码。查询当前按姓氏,名字排序。这很好,除非他们输入一个邮政编码,然后我想通过邮政编码而不是名字来订购结果。那可能吗?我希望这发生在同一个查询而不是两个。一个潜在的问题:如果输入的值与name和zip匹配怎么办?

谢谢!

伪查询:

SELECT firstName, lastName, zip
From Users
WHERE (FirstName LIKE 'search' OR LastName LIKE 'search' OR Zip LIKE 'search')
ORDER BY LastName, FirstName

2 个答案:

答案 0 :(得分:1)

由于查询是以猜测哪个字段与搜索条件匹配的方式制定的,因此您可能想尝试猜测ORDER BY中哪个字段匹配:

SELECT firstName, lastName, zip
From Users
WHERE (FirstName LIKE 'search' OR LastName LIKE 'search' OR Zip LIKE 'search')
ORDER BY 
    CASE WHEN FirstName LIKE 'search' THEN FirstName ELSE NULL END
,   CASE WHEN LastName LIKE 'search' THEN LastName ELSE NULL END
,   CASE WHEN Zip LIKE 'search' THEN Zip ELSE NULL END

当然,这假定'search'代表您传递给查询的内容,它是LIKE运算符的有意义参数,即具有元字符,格式正确,等等

答案 1 :(得分:0)

SELECT firstName, lastName, zip From Users
WHERE (FirstName LIKE '%search%' OR LastName LIKE '%search%' OR Zip LIKE '%search%')
ORDER BY LastName, FirstName

如果可能,尝试用=替换LIKE。它提高了查询的速度。 无论如何,你为什么不做一个if-else块呢?

伪代码:

if (input = name){
    SELECT firstName, lastName, zip From Users
    WHERE (FirstName LIKE '%search%' OR LastName LIKE '%search%')
    ORDER BY LastName, FirstName
}
else if (input = zipcode) {
    SELECT firstName, lastName, zip From Users
    WHERE Zip LIKE '%search%'
    ORDER BY zip
}
相关问题