假设我有一个数据库表,其中包含有关美国各城市的信息。我的显示屏显示的信息首先按州,然后是县,最后是城市,如下所示:
查询看起来像:
select * from myInfo order by state, county, city
一个新的皱纹是,所有包含名为“林肯”的城市的州都应首先订购州和县。没有名为林肯的城市的国家将被命令。期望的结果如下:
我可以在代码中执行这种复杂的排序,但我想知道在纯sql中实现是多么困难。结果查询有多难?
答案 0 :(得分:0)
...在纯sql中实现。
我看到两种可能的方式。
1)在COUNTY列上添加IIF()函数并通过该函数(如IIF(COUNTY =“Lincoln County”,1,2))进行排序 - 您正在使用IIF()来“覆盖”字母通过将其替换为“1”或“2”进行排序。
2)创建另一个包含字段(COUNTY_ID,COUNTY_NAME,SEQUENCE)的表,指定所需的特定序列。然后,您可以加入此表并将SEQUENCE添加到ORDER BY子句
选项2需要提前了解所有县。但优点是你可以添加比嵌套的IIF()子句更容易理解/维护的更复杂的排序规则。
答案 1 :(得分:0)
您可以尝试的另一件事是:
SELECT *, (city != 'Lincoln') AS test
FROM myInfo
....
ORDER BY test, state, county, city
(city != 'Lincoln')
会为您提供一个值为1的附加列,其中城市名称是林肯,然后这些行将在ORDER中被抛到顶部。
答案 2 :(得分:0)
假设你的数据库没有规范化,我的方法就是这样:从表中选择所有内容,添加一个自联接,看看(州,县)对是否有一个名为'Lincoln'的城市,并先对它们进行排序。
SELECT t1.*, (t2.state IS NOT NULL) AS has_lincoln
FROM myInfo t1
LEFT JOIN myInfo t2 ON (t2.state, t2.county, t2.city)
= (t1.state, t1.county, 'Lincoln')
ORDER BY t1.state, has_lincoln DESC, t1.county, t1.city
如果由于某种原因,您的数据库有多个名为“Lincoln”的城市具有相同的(州,县)对,请将DISTINCT
添加到混合中。或者更好的是,通过在UNIQUE
上添加(state, county, city)
密钥,确保数据库中没有重复的行