2014-03-05 80 views
2

M2014是DB表中的文本字段。CONCAT在mysql中SELECT語句的WHERE子句中

此語句正常工作(返回數= 368)

SELECT count(*) FROM arealist WHERE M2014 = 'Yes' 

不過,我有這個說法的問題(返回計數= 0)我已經改變 是CONCAT

SELECT count(*) FROM arealist WHERE concat('M','2014') = 'Yes' 

可能的原因和解決方案是什麼?

+5

'concat('M','2014')'是一個字符串。 M2014是一個列名 – AgRizzo

+1

'CONCAT'返回一個字符串,所以你在比較''M2014''到''是'',而那些不匹配 –

+1

你實際上得到的所有行'M2014'='是' – trogdor

回答

2

您正在比較第二個SELECT語句中的兩個字符串。第二條語句是附加兩個字符串'M'和'2014',這導致查詢比較'M2014'和'是'兩個字符串,而不是列的值。做一個聲明是這樣的:

SELECT COUNT(*)FROM AreaList WHERE M2014 = CONCAT( 'Y', '上課')

該聲明將返回368行。你最終試圖用這個聲明做什麼?

+0

查詢的目的是獲得所有的計數M2014 =是第一個語句是正確的答案368.我試圖用一個變量替換固定的2014我可以使查詢更靈活。部分列名是年份,所以我希望該行能夠替換列名的年份部分的變量。 – MrBrad

+0

那麼如何獲得更靈活的列名? – MrBrad

+0

不知道是什麼引用了你的表,但這是我要做的: 1.添加一個名爲「Calendar Year」NVARCHAR(4)的列。 2.然後有一個存儲'是'的列。 3.將年份值存儲在該列中。 4.請參閱下面的SQL SELECT COUNT(*)FROM AreaList 其中CalendarYear = '2014' AND 「YourYesColumn」= '是' –

0

您無法爲MySQL中的where子句生成動態列名。有很多堆棧溢出文章的效果。通常,我會安排我的數據,以便有某種與該行關聯的日期或時間戳,而不是使用日期特定的列。 (我假設M2014與2014年有關)。當以這種方式安排時,您可以根據您的日期要求來選擇您需要的。這就是說,如果你的數據模型是固定的,那麼你最好打賭的可能是使用另一種語言,C#,Python,無論如何創建你需要動態的列名,然後將整個查詢發送到MySQL。或者,你可以寫一個系列的SQL語句,一個日期列您感興趣的

在谷歌下面的查詢翻起了一些相關的結果:https://www.google.com/search?client=opera&q=dynamic+column+names+in+sql&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest&safe=active#channel=suggest&q=dynamic+column+names+in+mysql+where+clause&safe=active

0

你能做到這一點在PHP像

$year = 2014; 

    SELECT count(*) FROM arealist 
    WHERE M$year = 'Yes'