2011-04-20 57 views
0

我有一个SQLite查询,其中我按日期排序了结果。这工作正常。但是,当我在SQL语句中引入“DISTINCT”时,结果不再保持顺序。SQLite结果使用DISTINCT时出现故障

有什么想法?

SELECT date 
FROM details 
ORDER BY date(date); // Results are ordered correctly 

    April 04, 2011 
    April 04, 2011 
    April 04, 2011 
    April 03, 2011 
    April 01, 2011 
    March 25, 2011 

SELECT DISTINCT date 
FROM details 
ORDER BY date(date); // Results are out of order 

    April 01, 2011 
    April 03, 2011 
    April 04, 2011 
    March 25, 2011 
+1

你可以发布两个查询的实际返回的数据吗? – Oded 2011-04-20 19:25:12

+0

你可以发布你得到的结果吗 – reggie 2011-04-20 19:26:59

+0

更新我的原始帖子的结果。 – littleK 2011-04-20 19:28:59

回答

3

您的date列未被date()函数识别,所以date(date)给出了NULL

尝试用ORDER BY NULL两个查询你有相同的结果与ORDER BY date(date)

没有DISTINCT它是由插入顺序进行排序。

使用DISTINCT,订单来自DISTINCT本身并应用于date列,该列是一个文本,因此它是按字母顺序排列的。

SQLite不支持月份名称。您的数据更改为支持的格式(见Date And Time Functions),或者给它之前转换日期列公认的格式date()(用字符串函数)

例如(调用之前,把date的格式YYYY-mmm-dddate()作品):

(这里CASE WHEN仅限于你的数据,你可以将其扩展到所有个月)

SELECT DISTINCT date 
    FROM (SELECT *, 
       substr(date, -4) year, 
       substr(date, -8, 2) day, 
       trim(substr(date, 1, length(date)-8)) month 
     FROM details) as details 
ORDER BY date(year 
       || '-' 
       || CASE WHEN month = 'April' THEN '04' ELSE '03' END 
       || '-' 
       || day) 

,将给予正确的结果或没有DISTINCT

+0

有趣。我会尝试将我的数据格式化为支持的格式,然后放弃它。我会让你知道我在找什么 - thanks1 – littleK 2011-04-20 20:19:48

+0

你试过了吗?我很好奇它是否可以在SQLite中工作,因为我习惯了SQL Server中的限制,即禁止在应用DISTINCT时禁止不在选择列表中的任何列/表达式进行排序。 – 2011-04-20 20:34:38

+0

是的,它的工作原理。 – manji 2011-04-20 20:38:03

1

我不认为你的日期字符串是一个有效的日期格式。

尝试运行此SQL,看看你会得到什么:

SELECT strftime('%Y-%m-%d', date) FROM details; 

如果出现错误,不正确地分析您的日期。

您的第二个查询按字母顺序返回,而不是时间顺序 - 如果它不是该字段中的有效日期,那就是原因。

+0

BrianH,我在SQLite中运行了这个查询数据库浏览器对我的数据库,它报告“没有错误”,但没有结果显示。它是否正确? “日期”字段中的日期格式为:2011年4月1日。有什么想法? – littleK 2011-04-20 20:00:52